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