Springboot自動配置原理及DataSource的應用方式
自動配置springboot
自動配置功能會掃描所有引用jar包下的 META-INF/spring.factories 文件
找到其中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 對應的數(shù)據(jù)
作為自動配置類,然后根據(jù)條件判斷是否加載它們
自動配置與DataSource
DataSource 數(shù)據(jù)源的自動配置類是 DataSourceAutoConfiguration :
@Configuration(proxyBeanMethods = false) @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) @ConditionalOnMissingBean(type = "io.r2dbc.spi.ConnectionFactory") @AutoConfigureBefore(SqlInitializationAutoConfiguration.class) @EnableConfigurationProperties(DataSourceProperties.class) @Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.InitializationSpecificCredentialsDataSourceInitializationConfiguration.class, DataSourceInitializationConfiguration.SharedCredentialsDataSourceInitializationConfiguration.class }) public class DataSourceAutoConfiguration {}
1.其中 @ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class }) ,表示項目中必須存在 DataSource EmbeddedDatabaseType 這兩個類,而 EmbeddedDatabaseType 是在 spring-boot-starter-jdbc 依賴包中的,所以需要引入
2.連接數(shù)據(jù)庫需要引入驅(qū)動包,比如:mysql-connector-java
3.@EnableConfigurationProperties(DataSourceProperties.class) 表示啟用DataSourceProperties 配置類,數(shù)據(jù)庫的配置信息都在這個配置類中
4.Springboot 默認數(shù)據(jù)源是HikariDataSource,原因如下:
- 4.1DataSourceAutoConfiguration 被啟用之后,內(nèi)部存在一個配置類:
@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 {}
默認情況下,上面的條件都會滿足,需要關注 @Import 注解,這里導入了很多配置類,這些配置類上也會有各種 @Conditional… 條件顯示,默認情況下只會有 DataSourceConfiguration.Hikari.class 配置類的條件滿足,如下:
@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; } }
其中可以看到可以通過 spring.datasource.type 設置要使用的數(shù)據(jù)源類型,這里的 matchIfMissing = true 正是 HikariDataSource 成為默認數(shù)據(jù)源的關鍵,它表示如果spring.datasource.type 不配置的話,這個條件依然滿足。
內(nèi)部加載 HikariDataSource bean 的時候,可以看到標注了配置文件的前綴 spring.datasource.hikari ,其實這里的 DataSourceProperties 參數(shù)已經(jīng)包含了使用前綴 spring.datasource 配置的數(shù)據(jù)庫信息,而這些信息會被傳遞到 HikariDataSource 數(shù)據(jù)源中,而使用前綴 spring.datasource.hikari 的配置信息也會被應用到 HikariDataSource ,如果二者存在重復,spring.datasource.hikari 配置的數(shù)據(jù)會覆蓋之前的配置。
總結
以上就是 springboot 配置數(shù)據(jù)源以及HikariDataSource 作為默認數(shù)據(jù)源的邏輯,并且springboot 使用了spring.datasource.type 配置,控制了只會有一個 DataSource 實例被創(chuàng)建裝載。
這些僅為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
SpringBoot框架集成token實現(xiàn)登錄校驗功能
這篇文章主要為大家詳細介紹了SpringBoot框架集成token實現(xiàn)登錄校驗功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2019-08-08SSH框架網(wǎng)上商城項目第8戰(zhàn)之查詢和刪除商品類別功能實現(xiàn)
SSH框架網(wǎng)上商城項目第8戰(zhàn)之查詢和刪除商品類別功能實現(xiàn),為項目增加功能,添加、更新、刪除和查詢操作,感興趣的小伙伴們可以參考一下2016-05-05淺析SpringCloud Alibaba-Nacos 作為注冊中心示例代碼
這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊中心示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-10-10Java實現(xiàn)二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
這篇文章主要介紹了Java實現(xiàn)二叉樹的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結合實例形式詳細分析了二叉樹的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關操作實現(xiàn)技巧,需要的朋友可以參考下2018-04-04