本文主要對DataSourceAutoConfiguration類進(jìn)行講解,然后對這個(gè)類的注解做一個(gè)解釋,所以直接打開這個(gè)類,開始看……
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
內(nèi)部類EmbeddedDatabaseConfiguration注解
@Conditional(EmbeddedDatabaseCondition.class)
內(nèi)部類PooledDataSourceConfiguration注解
@Conditional(PooledDataSourceCondition.class)
總結(jié)
DataSourceAutoConfiguration類注解
@Configuration(proxyBeanMethods = false)
@Configuration這個(gè)注解比較常用,就不說了,主要是proxyBeanMethods = false。表示禁用代理模式,此時(shí) Spring 不會(huì)為 @Configuration
注解所標(biāo)注的類生成代理對象,而是直接調(diào)用其中的方法。
在實(shí)際開發(fā)中,如果一個(gè)類中的方法都是獨(dú)立的、無狀態(tài)的 Bean 配置方法(即通過 @Bean
注解定義的方法),則可以將 @Configuration(proxyBeanMethods = false)
應(yīng)用于該類以提高性能。因?yàn)榻么砟J娇梢员苊?Spring 為每個(gè) Bean 配置方法創(chuàng)建代理對象,從而減少 Spring 容器初始化和運(yùn)行時(shí)的開銷。但需要注意的是,禁用代理模式可能會(huì)導(dǎo)致部分功能失效,比如聲明的 Bean 不能被切面增強(qiáng)等。
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
表示只有當(dāng) DataSource
和 EmbeddedDatabaseType
這兩個(gè)類在當(dāng)前應(yīng)用的類路徑上存在時(shí),被該注解所標(biāo)注的 Bean 或配置類才會(huì)被創(chuàng)建和注冊。其中 DataSource
是 Java 標(biāo)準(zhǔn)庫中的數(shù)據(jù)庫連接池接口,而 EmbeddedDatabaseType
則是 Spring Boot 提供的用于支持嵌入式數(shù)據(jù)庫的枚舉類。
@ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory")
表示只有當(dāng)容器中不存在 io.r2dbc.spi.ConnectionFactory
類型的 Bean 時(shí),被該注解所標(biāo)注的 Bean 或配置類才會(huì)被創(chuàng)建和注冊。其中 io.r2dbc.spi.ConnectionFactory
是 R2DBC 數(shù)據(jù)庫連接抽象接口。
@EnableConfigurationProperties(DataSourceProperties.class)
表示開啟 DataSourceProperties
配置屬性類的自動(dòng)注入。Spring Boot 會(huì)自動(dòng)根據(jù)字段或 setter
方法的名稱來匹配 DataSourceProperties
中的屬性,在容器啟動(dòng)時(shí)將配置文件中的屬性值自動(dòng)注入到 DataSourceProperties
類對象中。
通常情況下,在使用 Spring Boot 開發(fā)應(yīng)用時(shí),我們會(huì)使用 @ConfigurationProperties
注解來定義應(yīng)用需要的配置項(xiàng)。通過定義一個(gè)與配置文件對應(yīng)的配置屬性類,并使用 @EnableConfigurationProperties
進(jìn)行開啟自動(dòng)注入,我們可以將配置文件中的屬性值自動(dòng)注入到配置屬性類中,然后在應(yīng)用中使用該配置屬性類對象,從而方便地獲取和管理應(yīng)用的配置信息。
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
在 @Import
注解中,傳入一個(gè)包含多個(gè)配置類的數(shù)組,表示將這些配置類中定義的 Bean 或組件導(dǎo)入到當(dāng)前的配置類中,以便在容器啟動(dòng)時(shí)一起注冊到 Spring 容器中。
具體來說,在使用 Spring Boot 開發(fā)應(yīng)用時(shí),我們可能需要使用到其他模塊或第三方庫中的 Bean 或組件,此時(shí)可以通過 @Import
注解將相關(guān)的配置類或組件導(dǎo)入到當(dāng)前應(yīng)用的配置類中。
DataSourcePoolMetadataProvidersConfiguration
為支持的數(shù)據(jù)源提供一個(gè)?DataSourcePoolMetadataProvider實(shí)例,用來提供數(shù)據(jù)源連接池元數(shù)據(jù)信息的,包括連接池名稱、最大連接數(shù)、空閑連接數(shù)等。
DataSourceInitializationConfiguration
初始化數(shù)據(jù)源的,包括執(zhí)行 SQL 腳本、設(shè)置數(shù)據(jù)源編碼等。
內(nèi)部類EmbeddedDatabaseConfiguration注解
@Configuration(proxyBeanMethods = false)不再贅述。
@Conditional(EmbeddedDatabaseCondition.class)
如果符合EmbeddedDatabaseCondition的條件,才能繼續(xù)往下讀取注解
判斷條件是getMatchOutcome的代碼
可以看出如果spring.datasource.url設(shè)置則不符合條件
如果滿足pooledCondition則不符合條件(直接看PooledDataSourceCondition,下邊再講)
如果沒有EmbeddedDatabase則不符合條件,其余符合
所以以上情況下嵌入式數(shù)據(jù)源是不會(huì)使用到的
下邊注解不再贅述
內(nèi)部類PooledDataSourceConfiguration注解
@Configuration(proxyBeanMethods = false)不再贅述
@Conditional(PooledDataSourceCondition.class)
這個(gè)條件類繼承了AnyNestedCondition這個(gè)類表示任一條件符合就生效
指定spring.datasource.type則生效
"com.zaxxer.hikari.HikariDataSource", "org.apache.tomcat.jdbc.pool.DataSource", "org.apache.commons.dbcp2.BasicDataSource"
以上三個(gè)數(shù)據(jù)源有一個(gè)可用則生效,內(nèi)置的有HikariDataSource所以生效@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })不再贅述
最后一個(gè)Import注解第一個(gè)導(dǎo)入的就是DataSourceConfiguration.Hikari,所以生效的就是Hikari它,并且這些類的注解上都有一個(gè)@ConditionalOnMissingBean(DataSource.class)。文章來源:http://www.zghlxwxcb.cn/news/detail-459850.html
總結(jié)
數(shù)據(jù)源開胃菜,復(fù)習(xí)注解文章來源地址http://www.zghlxwxcb.cn/news/detail-459850.html
到了這里,關(guān)于SpringBoot數(shù)據(jù)源——為什么平時(shí)默認(rèn)線程池是Hikari的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!