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

来源:互联网 发布:gephi数据分析案例 编辑:程序博客网 时间:2024/06/05 02:24

本篇讲的不仅是数据源配置,这也是spring boot实现自动配置的一部分。要理解数据源的配置原理,首先要理解第十篇tomcat连接池的配置

数据源配置源码

这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,中文注释都是我加的,主要介绍Tomcat和Hikari连接池如何自动配置切换,其他数据源配置也是一样的原理
[java] view plain copy
  1. abstract class DataSourceConfiguration {    
  2.       
  3.     //省略其他源码  
  4.       
  5.     //Tomcat数据源配置  
  6.     //如果当前环境中加载了括号里面的class,注解条件成立,系统将会加载被注解的内容  
  7.     @ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)    
  8.     //如果在properties中配置了spring.datasource.type=org.apache.tomcat.jdbc.pool.DataSource 条件成立  
  9.     //matchIfMissing = true指如果没有配置这个参数,默认条件仍然成立  
  10.     @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)    
  11.     //上面两个条件都成立时,系统会加载Tomcat数据源配置  
  12.     static class Tomcat extends DataSourceConfiguration {   
  13.         //将方法返回的bean 注入spring  
  14.         @Bean    
  15.         //将properties文件中以spring.datasource.tomcat开头的属性值注入到方法返回的bean(tomcat连接池)  
  16.         @ConfigurationProperties(prefix = "spring.datasource.tomcat")    
  17.         public org.apache.tomcat.jdbc.pool.DataSource dataSource(DataSourceProperties properties) {    
  18.             //创建tomcat数据源作为方法返回值,源码省略  
  19.         }    
  20.     }    
  21.       
  22.     //Hikari数据源配置,注解意思同上  
  23.     @ConditionalOnClass(HikariDataSource.class)    
  24.     @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)    
  25.     static class Hikari extends DataSourceConfiguration {    
  26.         @Bean    
  27.         @ConfigurationProperties(prefix = "spring.datasource.hikari")    
  28.         public HikariDataSource dataSource(DataSourceProperties properties) {    
  29.             //创建Hikari数据源作为方法返回值,源码省略  
  30.         }    
  31.     }    
  32.       
  33.     //省略其他源码  

默认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的第一个注解条件才会成立

[html] view plain copy
  1. <dependency>   
  2.     <groupId>com.zaxxer</groupId>  
  3.     <artifactId>HikariCP</artifactId>  
  4. </dependency>   
2. application.properties中作以下配置,会造成tomcat连接池第二个注解条件不成立,并使Hikari的第二个注解条件成立
[plain] view plain copy
  1. spring.datasource.type=com.zaxxer.hikari.HikariDataSource  

另外:如果不配置上一行,默认tomcat和Hikari条件都成立,在前面注入tomcat以后,系统已经有了连接池,就不会再注入后面的Hikari了。此时在jdbc组件中排除tomcat的class,也可以使tomcat的第一个注解条件不成立,如下

[html] view plain copy
  1. <dependency>    
  2.     <groupId>org.springframework.boot</groupId>    
  3.     <artifactId>spring-boot-starter-jdbc</artifactId>    
  4.     <exclusions>    
  5.         <exclusion>    
  6.             <artifactId>tomcat-jdbc</artifactId>    
  7.             <groupId>org.apache.tomcat</groupId>    
  8.         </exclusion>    
  9.     </exclusions>    
  10. </dependency>   

druid

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

查看当前数据库

如果要验证当前运行时的数据源到底是哪一个,可以在控制层用以下方法查看
[java] view plain copy
  1. @Autowired    
  2. javax.sql.DataSource dataSource;  
  3. @RequestMapping("/")  
  4. public void test() {  
  5.     System.out.println(dataSource.getClass());  

原创粉丝点击