Springboot2.x之自动配置数据源

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.DataSourceorg.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>
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值