spring boot(12)-資料來源配置原理
阿新 • • 發佈:2019-01-22
本篇講的不僅是資料來源配置,這也是spring boot實現自動配置的一部分。要理解資料來源的配置原理,首先要理解第十篇tomcat連線池的配置
資料來源配置原始碼
這裡擷取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分原始碼,中文註釋都是我加的,主要介紹Tomcat和Hikari連線池如何自動配置切換,其他資料來源配置也是一樣的原理abstract class DataSourceConfiguration { //省略其他原始碼 //Tomcat資料來源配置 //如果當前環境中載入了括號裡面的class,註解條件成立,系統將會載入被註解的內容 @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class) //如果在properties中配置了spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 條件成立 //matchIfMissing = true指如果沒有配置這個引數,預設條件仍然成立 @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true) //上面兩個條件都成立時,系統會載入Tomcat資料來源配置 static class Tomcat extends DataSourceConfiguration { //將方法返回的bean 注入spring @Bean //將properties檔案中以spring.datasource.tomcat開頭的屬性值注入到方法返回的bean(tomcat連線池) @ConfigurationProperties(prefix = "spring.datasource.tomcat") public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) { //建立tomcat資料來源作為方法返回值,原始碼省略 } } //Hikari資料來源配置,註解意思同上 @ConditionalOnClass(HikariDataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true) static class Hikari extends DataSourceConfiguration { @Bean @ConfigurationProperties(prefix = "spring.datasource.hikari") public HikariDataSource dataSource(DataSourceProperties properties) { //建立Hikari資料來源作為方法返回值,原始碼省略 } } //省略其他原始碼
預設tomcat連線池
只要在spring boot中添加了jdbc元件,就會自動載入tomcat連線池的class。所以從以上原始碼可以看出,只要有jdbc元件,預設會配置tomcat連線池。
配置Hikari連線池
第十篇說過Hikari是當前最好的連線池,可以參考官方測試資料。從原始碼可以看出,在spring boot預設連線池中,tomcat排在第一位置,第二個就是Hikari,其中的註解和tomcat連線池是一樣的,只要理解了tomcat的配置就可以理解 如何配置Hikari,需要改兩個地方。
1. spring boot預設沒有Hikari的class,需要在pom.xml中新增依賴,Hikari的第一個註解條件才會成立
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
</dependency>
2. application.properties中作以下配置,會造成tomcat連線池第二個註解條件不成立,並使Hikari的第二個註解條件成立spring.datasource.type=com.zaxxer.hikari.HikariDataSource
另外:如果不配置上一行,預設tomcat和Hikari條件都成立,在前面注入tomcat以後,系統已經有了連線池,就不會再注入後面的Hikari了。此時 在jdbc元件中排除tomcat的class,也可以使tomcat的第一個註解條件不成立,如下
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
<exclusions>
<exclusion>
<artifactId>tomcat-jdbc</artifactId>
<groupId>org.apache.tomcat</groupId>
</exclusion>
</exclusions>
</dependency>
druid
druid連線池可能在國外不流行,在spring boot中並沒有其相關原始碼。不過上篇講過,只要添加了druid元件依賴,會優先配置druid連線池,就不會再載入本篇的所有配置,這是在druid元件中自動實現的。檢視當前資料庫
如果要驗證當前執行時的資料來源到底是哪一個,可以在控制層用以下方法檢視 @Autowired
javax.sql.DataSource dataSource;
@RequestMapping("/")
public void test() {
System.out.println(dataSource.getClass());
}