1. 程式人生 > >spring boot(12)-資料來源配置原理

spring boot(12)-資料來源配置原理

本篇講的不僅是資料來源配置,這也是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());
	}