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