本文主要对DataSourceAutoConfiguration类进行讲解,然后对这个类的注解做一个解释,所以直接打开这个类,开始看……
ps:我用的版本是2.3.0.RELEASE
目录
DataSourceAutoConfiguration类注解
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
DataSourcePoolMetadataProvidersConfiguration
DataSourceInitializationConfiguration
内部类EmbeddedDatabaseConfiguration注解
@Conditional(EmbeddedDatabaseCondition.class)
内部类PooledDataSourceConfiguration注解
@Conditional(PooledDataSourceCondition.class)
总结
@Configuration这个注解比较常用,就不说了,主要是proxyBeanMethods = false。表示禁用代理模式,此时 Spring 不会为 @Configuration
注解所标注的类生成代理对象,而是直接调用其中的方法。
在实际开发中,如果一个类中的方法都是独立的、无状态的 Bean 配置方法(即通过 @Bean
注解定义的方法),则可以将 @Configuration(proxyBeanMethods = false)
应用于该类以提高性能。因为禁用代理模式可以避免 Spring 为每个 Bean 配置方法创建代理对象,从而减少 Spring 容器初始化和运行时的开销。但需要注意的是,禁用代理模式可能会导致部分功能失效,比如声明的 Bean 不能被切面增强等。
表示只有当 DataSource
和 EmbeddedDatabaseType
这两个类在当前应用的类路径上存在时,被该注解所标注的 Bean 或配置类才会被创建和注册。其中 DataSource
是 Java 标准库中的数据库连接池接口,而 EmbeddedDatabaseType
则是 Spring Boot 提供的用于支持嵌入式数据库的枚举类。
表示只有当容器中不存在 io.r2dbc.spi.ConnectionFactory
类型的 Bean 时,被该注解所标注的 Bean 或配置类才会被创建和注册。其中 io.r2dbc.spi.ConnectionFactory
是 R2DBC 数据库连接抽象接口。
表示开启 DataSourceProperties
配置属性类的自动注入。Spring Boot 会自动根据字段或 setter
方法的名称来匹配 DataSourceProperties
中的属性,在容器启动时将配置文件中的属性值自动注入到 DataSourceProperties
类对象中。
通常情况下,在使用 Spring Boot 开发应用时,我们会使用 @ConfigurationProperties
注解来定义应用需要的配置项。通过定义一个与配置文件对应的配置属性类,并使用 @EnableConfigurationProperties
进行开启自动注入,我们可以将配置文件中的属性值自动注入到配置属性类中,然后在应用中使用该配置属性类对象,从而方便地获取和管理应用的配置信息。
在 @Import
注解中,传入一个包含多个配置类的数组,表示将这些配置类中定义的 Bean 或组件导入到当前的配置类中,以便在容器启动时一起注册到 Spring 容器中。
具体来说,在使用 Spring Boot 开发应用时,我们可能需要使用到其他模块或第三方库中的 Bean 或组件,此时可以通过 @Import
注解将相关的配置类或组件导入到当前应用的配置类中。
为支持的数据源提供一个 DataSourcePoolMetadataProvider实例,用来提供数据源连接池元数据信息的,包括连接池名称、最大连接数、空闲连接数等。
初始化数据源的,包括执行 SQL 脚本、设置数据源编码等。
@Configuration(proxyBeanMethods = false)不再赘述。
如果符合EmbeddedDatabaseCondition的条件,才能继续往下读取注解
判断条件是getMatchOutcome的代码
可以看出如果spring.datasource.url设置则不符合条件
如果满足pooledCondition则不符合条件(直接看PooledDataSourceCondition,下边再讲)
如果没有EmbeddedDatabase则不符合条件,其余符合
所以以上情况下嵌入式数据源是不会使用到的
下边注解不再赘述
@Configuration(proxyBeanMethods = false)不再赘述
这个条件类继承了AnyNestedCondition这个类表示任一条件符合就生效
指定spring.datasource.type则生效
"com.zaxxer.hikari.HikariDataSource", "org.apache.tomcat.jdbc.pool.DataSource", "org.apache.commons.dbcp2.BasicDataSource"
以上三个数据源有一个可用则生效,内置的有HikariDataSource所以生效@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })不再赘述
最后一个Import注解第一个导入的就是DataSourceConfiguration.Hikari,所以生效的就是Hikari它,并且这些类的注解上都有一个@ConditionalOnMissingBean(DataSource.class)。
数据源开胃菜,复习注解