Spring Boot (14) 数据源配置原理

数据源配置源码

  这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hikari连接池如何自动配置切换,其他数据源配置也是一样的原理

    ...
    //Tomcat数据源配置-如果当前环境中加载了括号里面的class,注解条件成立,系统将会加载被注解的内容
    @ConditionalOnClass({org.apache.tomcat.jdbc.pool.DataSource.class})
//如果在properties中配置了spring.datasource.type=org.apache.tomcat.jdbc.poll.DataSource则条件成立 matchIfMissing=true 如果没有配置这个参数,默认条件成立 @ConditionalOnProperty( name
= {"spring.datasource.type"}, havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true )
//上面两个条件都成立,系统会加载Tomcat数据源配置
static class Tomcat extends DataSourceConfiguration { Tomcat() { } //将方法返回的bean 注入spring @Bean
//将properties文件中以spring.datasource.tomcat开头的属性值注入到方法返回的bean(tomcat连接池) @ConfigurationProperties(
"spring.datasource.tomcat") public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) { org.apache.tomcat.jdbc.pool.DataSource dataSource = (org.apache.tomcat.jdbc.pool.DataSource)this.createDataSource(properties, org.apache.tomcat.jdbc.pool.DataSource.class); DatabaseDriver databaseDriver = DatabaseDriver.fromJdbcUrl(properties.determineUrl()); String validationQuery = databaseDriver.getValidationQuery(); if (validationQuery != null) { dataSource.setTestOnBorrow(true); dataSource.setValidationQuery(validationQuery); } return dataSource; } } ...

Hikari数据源配置,注解意思同上

    @ConditionalOnClass({HikariDataSource.class})
    @ConditionalOnProperty(
        name = {"spring.datasource.type"},
        havingValue = "com.zaxxer.hikari.HikariDataSource",
        matchIfMissing = true
    )
    static class Hikari extends DataSourceConfiguration {
        Hikari() {
        }

        @Bean
        @ConfigurationProperties("spring.datasource.hikari")
        public HikariDataSource dataSource(DataSourceProperties properties) {
            return (HikariDataSource)this.createDataSource(properties, HikariDataSource.class);
        }
    }

默认tomcat连接池

  只要在spring boot中添加了jdbc组建,就会自动加载tomcat连接池的class。从源码中可以看出,默认会加载tomcat连接池。

配置Hikari连接池

  Hikari连接池是当前最好的连接池,可以参考官方测试数据。

1.spring boot默认没有Hikari的class,需要在pom.xml中添加依赖,Hikari的第一个注解条件才会成立

        <!--Hikari连接池 -->
        <dependency>
            <groupId>com.zaxxer</groupId>
            <artifactId>HikariCP</artifactId>
        </dependency>

2.application.yml中配置,会造成tomcat连接池第二个注解条件不成立,并使Hikari的第二个注解条件成立

spring:
  datasource:
    type: com.zaxxer.hikari.HikariDataSource

如果不配置datasource.type属性,spring boot会按照它的顺序进行加载,加载了一个 已经有了就不会再注入后面的连接池了。

druid

  druid连接池可能在国外不流行,在spring boot并没有其相关源码,不过只要添加了druid组建依赖,会优先配置druid连接池,就不会再加载本篇的所有配置,这是在druid组件中自动实现的。

查看当前数据库

  如果要验证当前运行的数据源到底是哪一个,可以在控制层用以下方法查看

    @Resource
    javax.sql.DataSource dataSource;
    @RequestMapping("/")
    public void test() {
        System.out.println(dataSource.getClass());
    }

class com.alibaba.druid.pool.DruidDataSource