“Spring Boot 2 数据库场景的自动配置分析与整合测试”的版本间的差异

来自姬鸿昌的知识库
跳到导航 跳到搜索
 
(未显示同一用户的7个中间版本)
第45行: 第45行:
  
 
* DataSourceAutoConfiguration:数据源的自动配置
 
* DataSourceAutoConfiguration:数据源的自动配置
 +
**修改数据源相关的配置:spring.datasource[[文件:修改数据源相关的配置1.png|无|缩略图|590x590像素]][[文件:修改数据源相关的配置2.png|无|缩略图|706x706像素]]
 +
**数据库连接池的配置,是自己容器中没有 DataSource 的 bean 才自动配置的<syntaxhighlight lang="java">
 +
@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 {
 +
 +
}
 +
</syntaxhighlight><syntaxhighlight lang="java">
 +
/**
 +
* 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;
 +
}
 +
 +
}
 +
</syntaxhighlight>
 +
**底层配置好的连接池是:HikariDataSource
 +
*DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置
 +
*JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置,可以用来对数据库进行 CRUD
 +
*JndiDataSourceAutoConfiguration:JNDI 的自动配置
 +
*XADataSourceAutoConfiguration:分布式事务的相关配置

2023年1月30日 (一) 10:11的最新版本

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:分布式事务的相关配置