“Spring Boot 2 数据库场景的自动配置分析与整合测试”的版本间的差异
跳到导航
跳到搜索
Jihongchang(讨论 | 贡献) (→自动配置的类) |
Jihongchang(讨论 | 贡献) (→自动配置的类) |
||
(未显示同一用户的3个中间版本) | |||
第45行: | 第45行: | ||
* DataSourceAutoConfiguration:数据源的自动配置 | * DataSourceAutoConfiguration:数据源的自动配置 | ||
− | **修改数据源相关的配置:spring.datasource | + | **修改数据源相关的配置: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:事务管理器的自动配置 | *DataSourceTransactionManagerAutoConfiguration:事务管理器的自动配置 | ||
*JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置,可以用来对数据库进行 CRUD | *JdbcTemplateAutoConfiguration:JdbcTemplate 的自动配置,可以用来对数据库进行 CRUD | ||
*JndiDataSourceAutoConfiguration:JNDI 的自动配置 | *JndiDataSourceAutoConfiguration:JNDI 的自动配置 | ||
*XADataSourceAutoConfiguration:分布式事务的相关配置 | *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>
为什么没有数据库驱动?
为什么导入 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:分布式事务的相关配置