DataSourceAutoConfiguration
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass({ DataSource.class, EmbeddedDatabaseType.class })
@EnableConfigurationProperties(DataSourceProperties.class)
@Import({ DataSourcePoolMetadataProvidersConfiguration.class, DataSourceInitializationConfiguration.class })
public class DataSourceAutoConfiguration {
@Configuration(proxyBeanMethods = false)
//判断是否引入 内置数据库:H2,DERBY,HSQL
@Conditional(EmbeddedDatabaseCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
@Import(EmbeddedDataSourceConfiguration.class)
protected static class EmbeddedDatabaseConfiguration {
}
@Configuration(proxyBeanMethods = false)
//判断是否引入依赖的数据源:HikariDataSource、tomcat.jdbc.pool.DataSource、BasicDataSource
@Conditional(PooledDataSourceCondition.class)
@ConditionalOnMissingBean({ DataSource.class, XADataSource.class })
//如果同时导入了Hikari,Tomcat,Dbcp2以及其他数据源的依赖,那么顺序注册数据源,Hikari优先级最高,注册了Hikari数据源
//其他数据源就不注册了
@Import({ DataSourceConfiguration.Hikari.class, DataSourceConfiguration.Tomcat.class,
DataSourceConfiguration.Dbcp2.class, DataSourceConfiguration.Generic.class,
DataSourceJmxConfiguration.class })
protected static class PooledDataSourceConfiguration {
}
看到配置数据源的类PooledDataSourceConfiguration
,通过Import
注解导入了DataSourceConfiguration
里的一些内部类。
DataSourceConfiguration
可以看到往容器中注入了:三种数据源,springboot默认支持这三种数据源
- org.apache.tomcat.jdbc.pool.DataSource
- com.zaxxer.hikari.HikariDataSource
- org.apache.commons.dbcp2.BasicDataSource
但是看到要注入各个数据源的前提是满足一些条件:
1.@ConditionalOnClass
条件,什么意思呢,要导入各个数据源对应的依赖。
mybatis
自动导入的是HikariDataSource
数据源。org.apache.tomcat.jdbc.pool.DataSource
和org.apache.commons.dbcp2.BasicDataSource
是没有被导入的,所以默认的数据源就是HikariDataSource
数据源了,如果我们要使用别的数据源,就应该先排除HikariDataSource
数据源,再导入别的数据源的依赖即可。
第二个要满足的条件是@ConditionalOnMissingBean(DataSource.class)
,容器中不存在数据源组件
第三个要满足的条件是@ConditionalOnProperty
,以HikariDataSource
为例,如果配置文件中没有配置spring.datasource.type
,则spring.datasource.type=com.zaxxer.hikari.HikariDataSource
,如果配置了spring.datasource.type
要等于com.zaxxer.hikari.HikariDataSource
,才满足条件。
以上三个条件都满足了,就可以通过@Bean
注解将对应的数据源导入到容器中了。
abstract class DataSourceConfiguration {
。。。
//HikariDataSource 数据源
@Configuration(proxyBeanMethods = false)
//导入HikariDataSource依赖
@ConditionalOnClass(HikariDataSource.class)
//容器中不存在数据源组件
@ConditionalOnMissingBean(DataSource.class)
//如果配置文件中没有配置spring.datasource.type,则spring.datasource.type=com.zaxxer.hikari.HikariDataSource
//如果配置了spring.datasource.type要等于com.zaxxer.hikari.HikariDataSource,才满足条件
@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;
}
}
。。。
//如果使用的不是springboot默认支持的那三种数据源,通过这里注册数据源组件
@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean(DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type")
static class Generic {
@Bean
DataSource dataSource(DataSourceProperties properties) {
return properties.initializeDataSourceBuilder().build();
}
}
}
总结:
mybatis-spring-boot-starter
默认支持的是HikariDataSource
数据源,如果我们要使用别的数据源,只需要排除HikariDataSource
数据源,导入别的数据源依赖即可,如果导入的是springboot
支持的数据源,就不需要在配置文件中配置spring.datasource.type=
,如果是别的数据源springboot不支持的,比如:c3p0
,那么需要配置spring.datasource.type=com.mchange.v2.c3p0.ComboPooledDataSource
。
附上别的数据源:
<!--c3p0-->
<!--<dependency>-->
<!--<groupId>com.mchange</groupId>-->
<!--<artifactId>c3p0</artifactId>-->
<!--<version>0.9.5.5</version>-->
<!--</dependency>-->
<!--tomcat-jdbc数据源-->
<dependency>
<groupId>org.apache.tomcat</groupId>
<artifactId>tomcat-jdbc</artifactId>
<version>9.0.31</version>
</dependency>
<!--dbcp2数据源-->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-dbcp2</artifactId>
<version>2.7.0</version>
</dependency>