Spring Boot 2 数据库场景的自动配置分析与整合测试

来自姬鸿昌的知识库
跳到导航 跳到搜索

https://www.bilibili.com/video/BV19K4y1L7MT?p=60

数据源的自动配置

导入JDBC场景

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
Spring-boot-starter-data-jdbc依赖包含 1.png

为什么没有数据库驱动?

为什么导入 JDBC 场景,官方不导入驱动?官方不知道我们接下来要操作什么数据库。

<mysql.version>8.0.22</mysql.version>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

如果想要修改版本 直接依赖引入具体版本(Maven 的就近原则)

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.49</version>
        </dependency>

或者重新声明版本(Maven 的属性的就近优先原则)

    <properties>
        <mysql.version>5.1.49</mysql.version>
    </properties>



分析自动配置

生成缩略图出错:无法将缩略图保存到目标地点
生成缩略图出错:无法将缩略图保存到目标地点

自动配置的类

  • DataSourceAutoConfiguration:数据源的自动配置
    • 修改数据源相关的配置:spring.datasource
      生成缩略图出错:无法将缩略图保存到目标地点
      生成缩略图出错:无法将缩略图保存到目标地点
    • 数据库连接池的配置,是自己容器中没有 DataSource 的 bean 才自动配置的
      	@Configuration(proxyBeanMethods = false)
      	@Conditional(PooledDataSourceCondition.class)
      	@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
      	@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
      			DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.OracleUcp.class,
      			DataSourceConfiguration.Generic.class, DataSourceJmxConfiguration.class })
      	protected static class PooledDataSourceConfiguration {
      
      	}
      
      	/**
      	 * Hikari DataSource configuration.
      	 */
      	@Configuration(proxyBeanMethods = false)
      	@ConditionalOnClass(HikariDataSource.class)
      	@ConditionalOnMissingBean(DataSource.class)
      	@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
      			matchIfMissing = true)
      	static class Hikari {
      
      		@Bean
      		@ConfigurationProperties(prefix = "spring.datasource.hikari")
      		HikariDataSource dataSource(DataSourceProperties properties) {
      			HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
      			if (StringUtils.hasText(properties.getName())) {
      				dataSource.setPoolName(properties.getName());
      			}
      			return dataSource;
      		}
      
      	}
      
    • 底层配置好的连接池是:HikariDataSource
  • DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置
  • JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置,可以用来对数据库进行 CRUD
  • JndiDataSourceAutoConfiguration:JNDI 的自动配置
  • XADataSourceAutoConfiguration:分布式事务的相关配置