一、整合数据连接池
- SpringBoot内部默认支持多种数据源:
- 每个版本默认的数据源不同;
- Springboot的2.2.2 Release版本默认是HikariDataSource;
<!--默认支持的数据源-->
org.apache.tomcat.jdbc.pool.DataSource;
com.zaxxer.hikari.HikariDataSource;
org.apache.commons.dbcp2.BasicDataSource
1. 默认数据源配置
pom文件
<!--数据库的驱动,版本在parent工程中管理-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--告诉SpringBoot:用什么数据库,版本在parent工程中传递-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
application.yaml文件
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://60.205.229.31:3307/activemq
至此,数据库信息已经配置完成,已经可以正常结合mybatis使用数据源
测试类
- 完成以上配置后,Springboot会读取配置文件中关于datasource的属性字段,赋值给DataSource对象,并将该dataSource注入到容器中;
@RestController
public class MyDataSourceController {
@Autowired
private DataSource dataSource;
@GetMapping("/datasource/getinfo")
public String getDataSource() throws SQLException {
Connection connection = dataSource.getConnection();
// 默认是HikariDataSource
System.out.println(dataSource);
return "SUCCESS";
}
}
2. 切换到当前版本默认的其他数据源
application.yaml
# 只需要加上type属性就可以了
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://60.205.229.31:3307/activemq
type: com.mysql.cj.jdbc.MysqlDataSource
3. 切换当前版本没有默认支持的数据源
步骤一:
- 以DruidDataSource为例;
- 先添加对应数据源的依赖;
- 再修改对应的application.yaml中的type属性
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.9</version>
</dependency>
application.yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://60.205.229.31:3307/activemq
type: com.alibaba.druid.pool.DruidDataSource
当前配置,已经保证了DruidDataSource可以正常使用;
步骤二:
- 但是datasource的复杂配置,并不能自动注入到Springboot默认的DataSource中;
- 如果想使这些配置生效,需要手动注入DataSource,从而掩盖Springboot默认的DataSource;
application.yaml
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
username: root
password: 123456
url: jdbc:mysql://60.205.229.31:3307/activemq
type: com.alibaba.druid.pool.DruidDataSource
# 如果要使下面这种配置生效,则需要自己手动配置数据源的信息
minIdle: 5
maxIdle: 5
maxActive: 20
手动注入datasouce
@Configuration
public class SzDruidConfig {
/**1. 读取配置文件中的相关参数,对应到该Bean中;
* 2. 现在容器中数据源是手动创建的,覆盖了系统默认配置的*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource getDataSource(){
return new DruidDataSource();
}
}
二、自动配置原理
- 相关配置都在: org.springframework.boot.autoconfigure.jdbc的包下
1. DataSourceProperties类
/**1. 读取配置文件中中spring.datasouce中对应的字段;
2. 将字段对应到该类中的属性中*/
@ConfigurationProperties(prefix = "spring.datasource")
public class DataSourceProperties implements BeanClassLoaderAware, InitializingBean {
/** 1. 自动装配类的部分字段,type字段是在该类所继承的其他类中*/
private Class<? extends DataSource> type;
private String driverClassName;
private String url;
private String username;
private String password;
private String jndiName;
}
2. DataSourceConfiguration
- 根据配置的具体属性,来创建数据源;
- 默认了三种数据源,也可以自定义数据源;
/**
* Hikari DataSource configuration: 默认的众多数据源之一
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(HikariDataSource.class)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource",
matchIfMissing = true)
static class Hikari {
@Bean
@ConfigurationProperties(prefix = "spring.datasource.hikari")
HikariDataSource dataSource(DataSourceProperties properties) {
HikariDataSource dataSource = createDataSource(properties, HikariDataSource.class);
if (StringUtils.hasText(properties.getName())) {
dataSource.setPoolName(properties.getName());
}
return dataSource;
}
}
/**
* Generic DataSource configuration:自定义的外在的数据源
*/
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}