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)配置類,然后根據(jù)條件判斷是否加載它們
自動(dòng)配置與DataSource
DataSource 數(shù)據(jù)源的自動(dòng)配置類是 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è)類,而 EmbeddedDatabaseType 是在 spring-boot-starter-jdbc 依賴包中的,所以需要引入
2.連接數(shù)據(jù)庫(kù)需要引入驅(qū)動(dòng)包,比如:mysql-connector-java
3.@EnableConfigurationProperties(DataSourceProperties.class) 表示啟用DataSourceProperties 配置類,數(shù)據(jù)庫(kù)的配置信息都在這個(gè)配置類中
4.Springboot 默認(rèn)數(shù)據(jù)源是HikariDataSource,原因如下:
- 4.1DataSourceAutoConfiguration 被啟用之后,內(nèi)部存在一個(gè)配置類:
@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ì)滿足,需要關(guān)注 @Import 注解,這里導(dǎo)入了很多配置類,這些配置類上也會(huì)有各種 @Conditional… 條件顯示,默認(rèn)情況下只會(huì)有 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;
}
}其中可以看到可以通過(guò) spring.datasource.type 設(shè)置要使用的數(shù)據(jù)源類型,這里的 matchIfMissing = true 正是 HikariDataSource 成為默認(rèn)數(shù)據(jù)源的關(guān)鍵,它表示如果spring.datasource.type 不配置的話,這個(gè)條件依然滿足。
內(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)文章
2023最新版本idea用maven新建web項(xiàng)目(親測(cè)不報(bào)錯(cuò))
這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項(xiàng)目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測(cè)不報(bào)錯(cuò),需要的朋友可以參考下2023-07-07
JPA設(shè)置默認(rèn)字段及其長(zhǎng)度詳解
JPA是Java Persistence API的簡(jiǎn)稱,中文名Java持久層API,是JDK 5.0注解或XML描述對(duì)象-關(guān)系表的映射關(guān)系,并將運(yùn)行期的實(shí)體對(duì)象持久化到數(shù)據(jù)庫(kù)中。本文主要介紹了JPA如何設(shè)置默認(rèn)字段及其長(zhǎng)度,感興趣的同學(xué)可以了解一下2021-12-12
java實(shí)現(xiàn)隨機(jī)森林RandomForest的示例代碼
本篇文章主要介紹了java實(shí)現(xiàn)隨機(jī)森林RandomForest的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08
帶你重新認(rèn)識(shí)Java動(dòng)態(tài)代理
這篇文章主要為大家介紹了Java的動(dòng)態(tài)代理,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助2021-11-11
Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間
這篇文章主要為大家詳細(xì)介紹了Java動(dòng)態(tài)顯示當(dāng)前日期和時(shí)間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-12-12
MyBatis-Plus?Page?分頁(yè)不生效的問題解決
分頁(yè)是常見的一種功能,本文主要介紹了MyBatis-Plus?Page分頁(yè)不生效的問題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07
java中實(shí)現(xiàn)一個(gè)定時(shí)任務(wù)的方式
本文介紹了三種在Java中實(shí)現(xiàn)定時(shí)任務(wù)的方法,并推薦使用Spring Boot注解方式,介紹了如何使用`@Scheduled`注解結(jié)合Cron表達(dá)式來(lái)設(shè)置定時(shí)任務(wù),并提供了一個(gè)示例配置文件2025-03-03
SpringMVC post請(qǐng)求中文亂碼問題解決
這篇文章主要介紹了SpringMVC post請(qǐng)求中文亂碼問題解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-12-12

