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());
	}
    原文作者:Spring Boot
    原文地址: https://blog.csdn.net/wangb_java/article/details/75703544
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞