Springboot自動(dòng)配置原理及DataSource的應(yīng)用方式
自動(dòng)配置springboot
自動(dòng)配置功能會(huì)掃描所有引用jar包下的 META-INF/spring.factories 文件
找到其中的 org.springframework.boot.autoconfigure.EnableAutoConfiguration 對(duì)應(yīng)的數(shù)據(jù)
作為自動(dòng)配置類(lèi),然后根據(jù)條件判斷是否加載它們
自動(dòng)配置與DataSource
DataSource 數(shù)據(jù)源的自動(dòng)配置類(lèi)是 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 }) ,表示項(xiàng)目中必須存在 DataSource EmbeddedDatabaseType 這兩個(gè)類(lèi),而 EmbeddedDatabaseType 是在 spring-boot-starter-jdbc 依賴(lài)包中的,所以需要引入
2.連接數(shù)據(jù)庫(kù)需要引入驅(qū)動(dòng)包,比如:mysql-connector-java
3.@EnableConfigurationProperties(DataSourceProperties.class) 表示啟用DataSourceProperties 配置類(lèi),數(shù)據(jù)庫(kù)的配置信息都在這個(gè)配置類(lèi)中
4.Springboot 默認(rèn)數(shù)據(jù)源是HikariDataSource,原因如下:
- 4.1DataSourceAutoConfiguration 被啟用之后,內(nèi)部存在一個(gè)配置類(lè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 {}
默認(rèn)情況下,上面的條件都會(huì)滿(mǎn)足,需要關(guān)注 @Import 注解,這里導(dǎo)入了很多配置類(lèi),這些配置類(lèi)上也會(huì)有各種 @Conditional… 條件顯示,默認(rèn)情況下只會(huì)有 DataSourceConfiguration.Hikari.class 配置類(lèi)的條件滿(mǎn)足,如下:
@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; } }
其中可以看到可以通過(guò) spring.datasource.type 設(shè)置要使用的數(shù)據(jù)源類(lèi)型,這里的 matchIfMissing = true 正是 HikariDataSource 成為默認(rèn)數(shù)據(jù)源的關(guān)鍵,它表示如果spring.datasource.type 不配置的話(huà),這個(gè)條件依然滿(mǎn)足。
內(nèi)部加載 HikariDataSource bean 的時(shí)候,可以看到標(biāo)注了配置文件的前綴 spring.datasource.hikari ,其實(shí)這里的 DataSourceProperties 參數(shù)已經(jīng)包含了使用前綴 spring.datasource 配置的數(shù)據(jù)庫(kù)信息,而這些信息會(huì)被傳遞到 HikariDataSource 數(shù)據(jù)源中,而使用前綴 spring.datasource.hikari 的配置信息也會(huì)被應(yīng)用到 HikariDataSource ,如果二者存在重復(fù),spring.datasource.hikari 配置的數(shù)據(jù)會(huì)覆蓋之前的配置。
總結(jié)
以上就是 springboot 配置數(shù)據(jù)源以及HikariDataSource 作為默認(rèn)數(shù)據(jù)源的邏輯,并且springboot 使用了spring.datasource.type 配置,控制了只會(huì)有一個(gè) DataSource 實(shí)例被創(chuàng)建裝載。
這些僅為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot框架集成token實(shí)現(xiàn)登錄校驗(yàn)功能
這篇文章主要為大家詳細(xì)介紹了SpringBoot框架集成token實(shí)現(xiàn)登錄校驗(yàn)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08SpringBoot實(shí)現(xiàn)配置文件的替換
這篇文章主要介紹了SpringBoot實(shí)現(xiàn)配置文件的替換,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解
這篇文章主要為大家介紹了dubbo擴(kuò)展點(diǎn)AOP切面功能擴(kuò)展示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08SSH框架網(wǎng)上商城項(xiàng)目第8戰(zhàn)之查詢(xún)和刪除商品類(lèi)別功能實(shí)現(xiàn)
SSH框架網(wǎng)上商城項(xiàng)目第8戰(zhàn)之查詢(xún)和刪除商品類(lèi)別功能實(shí)現(xiàn),為項(xiàng)目增加功能,添加、更新、刪除和查詢(xún)操作,感興趣的小伙伴們可以參考一下2016-05-05使用注解開(kāi)發(fā)SpringMVC詳細(xì)配置教程
這篇文章主要介紹了使用注解開(kāi)發(fā)SpringMVC詳細(xì)配置教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-09-09Java網(wǎng)絡(luò)通信基礎(chǔ)編程(必看篇)
下面小編就為大家?guī)?lái)一篇Java網(wǎng)絡(luò)通信基礎(chǔ)編程(必看篇)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-05-05淺析SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼
這篇文章主要介紹了SpringCloud Alibaba-Nacos 作為注冊(cè)中心示例代碼,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法示例
這篇文章主要介紹了Java實(shí)現(xiàn)二叉樹(shù)的深度優(yōu)先遍歷和廣度優(yōu)先遍歷算法,結(jié)合實(shí)例形式詳細(xì)分析了二叉樹(shù)的定義、深度優(yōu)先遍歷與廣度優(yōu)先遍歷算法原理與相關(guān)操作實(shí)現(xiàn)技巧,需要的朋友可以參考下2018-04-04