本篇讲的不仅是数据源配置,这也是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. php 按照二位数组中某个指定的字段进行排序

    /** * 按照二维数组中某个指定的某个字段进行排序 * @param $array 需要被排序的数组 * @param $flag 排序的标志 1,SORT_DESC 降序 2,SORT_ASC 升 ...

  2. 【树】Count Complete Tree Nodes

    题目: 求完全二叉树节点数. 思路: 满二叉树的节点数是2^k-1,k是树的深度. 所以我们可以先判断该树是否为满二叉树,然后是的话直接返回结果,如果不是递归地求解子树. 这样不用遍历所有的节点.复杂 ...

  3. Postman安装及简介

    Postman简介 不管web自动化测试还是APP自动化端,测试过程中都会涉及到接口测试.接口测试分为服务器端测试和客户端测试.今天给大家介绍一个测试服务器端的小工具--Postman.它可以构造各类 ...

  4. dephi(pascal)中修改Label字体的样式(加粗,斜体,下划线)

    不废话,直接代码: Label1.Font.style:=[fsBold,fsItalic,fsUnderline]; //加粗.斜体,下划线

  5. BFS和DFS详解以及java实现

    前言 图在算法世界中的重要地位是不言而喻的,曾经看到一篇Google的工程师写的一篇<Get that job at Google!>文章中说到面试官问的问题中几乎有一半的问题都可以用图的 ...

  6. OOAD之单例模式Singleton的6种写法

    1  主要作用是保证在Java应用程序中,一个类Class只有一个实例存在. 一 :第一种 饿汉式(预加载) public class Singleton { private Singleton(){ ...

  7. css3的overflow-anchor

    overflow-anchor属性使我们能够选择退出滚动锚定,这是一个浏览器特性,旨在允许内容在用户当前的DOM位置上加载,而不需要在内容完全加载后更改用户的位置. 为何要有这个属性? 滚动锚定是一种 ...

  8. [POI 2014]RAJ-Rally

    Description 题库链接 给定一个 \(N\) 个点 \(M\) 条边的有向无环图,每条边长度都是 \(1\).请找到一个点,使得删掉这个点后剩余的图中的最长路径最短. \(1\leq N\l ...

  9. rpm包的rpmbuild spec文件详解

    http://machael.blog.51cto.com/829462/213477 上一篇日志写到,为什么要制作rpm包,以及如何使用.src.rpm文件生成rpm包.最后部分还看到.src.rp ...

  10. Spring----最小化Spring配置

    在Spring的配置文件中,我们可以使用<bean>元素定义Bean,以及使用<constructor-arg>或着<property>元素装配bean,这对于包含 ...