spring boot(12)-数据源配置原理

扫码关注公众号:Java 技术驿站

发送:vip
将链接复制到本浏览器,永久解锁本站全部文章

【公众号:Java 技术驿站】 【加作者微信交流技术,拉技术群】

本篇讲的不仅是数据源配置,这也是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> 
  1. 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());
        }

来源:[]()

赞(0) 打赏
版权归原创作者所有,任何形式的转载请联系博主:daming_90:Java 技术驿站 » spring boot(12)-数据源配置原理

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏