本篇讲的不仅是数据源配置,这也是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(12)-数据源配置原理的更多相关文章

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

    数据源配置源码 这里截取org.springframework.boot.autoconfigure.jdbc.DataSourceConfiguration的部分源码,主要介绍Tomcat和Hika ...

  2. Spring Boot多数据源配置(二)MongoDB

    在Spring Boot多数据源配置(一)durid.mysql.jpa 整合中已经讲过了Spring Boot如何配置mysql多数据源.本篇文章讲一下Spring Boot如何配置mongoDB多 ...

  3. Spring Boot的自动配置原理及启动流程源码分析

    概述 Spring Boot 应用目前应该是 Java 中用得最多的框架了吧.其中 Spring Boot 最具特点之一就是自动配置,基于Spring Boot 的自动配置,我们可以很快集成某个模块, ...

  4. spring boot多数据源配置(mysql,redis,mongodb)实战

    使用Spring Boot Starter提升效率 虽然不同的starter实现起来各有差异,但是他们基本上都会使用到两个相同的内容:ConfigurationProperties和AutoConfi ...

  5. 三、Spring Boot 多数据源配置

    下面一个Java类是已经写好的根据配置文件动态创建多dataSource的代码,其原理也很简单,就是读取配置文件,根据配置文件中配置的数据源数量,动态创建dataSource并注册到Spring中. ...

  6. Spring Boot Druid数据源配置

    package com.hgvip.config; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.su ...

  7. 21. Spring Boot Druid 数据源配置解析

    1.数据源配置属性类源码 package org.springframework.boot.autoconfigure.jdbc; @ConfigurationProperties( prefix = ...

  8. spring boot 多数据源配置与使用

    在介绍使用JdbcTemplate和Spring-data-jpa时,都使用了单数据源.在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文 ...

  9. Spring Boot多数据源配置与使用

    在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可.但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库 ...

随机推荐

  1. 再学Java 之 Integer 包装类缓存

    前言:本博文将涉及的Java的自动装箱和自动拆箱,可以参考 这篇文章 和 官方教程 ,这里不再赘述. 首先,先看一个小程序: public class Main { public static voi ...

  2. SQLServer2005重建索引

    今天发现一个页面运行很慢,用SQL Server Profiler抓出了一条运行时间为12s的sql ) and wfinstance is not null and wftbrq>='2016 ...

  3. ubuntu 下 重启 mongo 后 遇到蛋疼问题。

    以后,切忌 mongo 正常关闭后 ,再重启ubuntu. 否则后果这是很严重. 2014.8.6日 PM 6点. 网站莫名打不开了,全部是空白,又是老问题. 幸亏 及时发现,那就重启下. 蛋疼,重启 ...

  4. vmware不显示usb图标解决办法

    一.1.打开service.msc服务.​ 2.在“服务”中启动“VMware USB Arbitration Service”服务项.​ 3.重启vmware​ 二.如果有安全软件要设置vmware ...

  5. 配置alibaba的yum 源

    1, 进入yum源目录 cd /etc/yum.repos.d 2, 备份系统yum配置文件 sudo mv CentOS-Base.repo CentOS-Base.repo.bak 3, 下载al ...

  6. php发送get请求

    感谢:http://www.zoneself.org/2014/07/21/content_2665.html 1.用PHP发送get请求,很简单: <?php $url='http://www ...

  7. 基于Java的简易表达式解析工具(二)

    之前简单的介绍了这个基于Java表达式解析工具,现在把代码分享给大家,希望帮助到有需要的人们,这个分享代码中依赖了一些其他的类,这些类大家可以根据自己的情况进行导入,无非就是写字符串处理工具类,日期处 ...

  8. 使用update_attribute和validation

    在使用update_attribute方法时,不走validation 走validation的方法: create create! save save! update update_attribut ...

  9. hadoop学习笔记(五):HDFS Shell命令

    一.HDFS文件命令 以下是比较重要的一些命令: [root@master01 hadoop]# hadoop fs -ls / //查看根目录下的所有文件 [root@master01 hadoop ...

  10. DataTable如何删除特定行

    DataTable dt = dataSet1.table1.GetAllRows(); DataRow[] foundRow = dt.Select("catalogid = 0" ...