当前位置: 首页 > news >正文

SpringBoot底层-数据源自动配置类

SpringBoot默认使用Hikari连接池,当我们想要切换成Druid连接池,底层原理是怎样呢

SpringBoot默认连接池——Hikari

spring-boot-autoconfiguration包内有一个DataSourceConfiguraion配置类

abstract class DataSourceConfiguration {
	@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;
		}
	}
}
  • @ConditionalOnClass(HikariDataSource.class)Hikari包会自动导入,这个条件默认满足
  • @ConditionalOnMissingBean(DataSource.class)当不存在DataSource类型的Bean,这个条件为后续切换到Druid连接池做铺垫
  • @ConditionalOnProperty(name = "spring.datasource.type", havingValue = "com.zaxxer.hikari.HikariDataSource", matchIfMissing = true)中的matchIfMissing = true是重点,表示假如配置项没有这个配置spring.datasource.type=com.zaxxer.hikari.HikariDataSource,也满足这个条件

所以当spring.datasource.type没有被配置的时候,SpringBoot的自动配置会默认使用Hikari连接池

切换到Druid连接池

当我们在maven中引入druid-spring-boot-starter依赖的时候,就会有DruidDataSourceAutoConfigure配置类

@ConditionalOnClass({DruidDataSource.class})
@AutoConfigureBefore({DataSourceAutoConfiguration.class})
public class DruidDataSourceAutoConfigure {
    @ConditionalOnMissingBean
    public DataSource dataSource() {
        return new DruidDataSourceWrapper();
    }
}

class DruidDataSourceWrapper extends DruidDataSource implements InitializingBean {}
  • @ConditionalOnClass({DruidDataSource.class})导入DruidDataSource类,默认满足条件
  • @AutoConfigureBefore({DataSourceAutoConfiguration.class})这个是切换数据源的核心,表示在DataSourceAutoConfiguration配置类前自动装配,所以Druid连接池配置类优先于SpringBoot默认的数据源配置类DataSourceConfiguraion自动装配。

DruidDataSourceAutoConfigure 在自动装配时会实例化一个数据源对象DruidDataSourceWrapper,该对象的部分继承和实现关系是
DruidDataSourceWrapper与DataSource之间的关系
可以看到DruidDataSourceWrapper实际上实现了DataSource接口,此时Spring容器内有一个DateSource类型的Bean。
回顾上面Hikari连接池的条件,此时@ConditionalOnMissingBean(DataSource.class)条件就不成立了,所以Hikari连接池就不会被实例化

总结

我们在IDEA里启动SpringBoot的控制台中也通过日志观察此时的数据源是否切换成了Druid

SpringBoot日志

SpringBoot 2和SpringBoot 3的依赖区别

SpringBoot 2需引入的druid依赖为druid-spring-boot-starter
SpringBoot 3需引入的druid依赖为druid-spring-boot-3-starter

相关文章:

  • 版本控制工具——SVN
  • Linux之Shell脚本--命令提示的写法
  • Axure PR 9 中继器 08 添加行
  • JSON格式
  • Linux的那些基础常用命令汇总
  • 基于SSM的旅游推荐系统网站
  • 聊聊Spring AI的MilvusVectorStore
  • 前端网络请求与资源加载优化实战指南
  • 【AI提示词】因果溯源大师
  • SpringBoot学生成绩管理系统设计与实现
  • [Linux][经验总结]vi编辑文件中文乱码,但cat查看却显示正常处理方法
  • 国网B接口注册流程详解以及注册失败原因(电网B接口)
  • 明远智睿RK3588开发板助力工业机器智能化升级
  • 通过世界排名第一的免费开源ERP,构建富有弹性的智能供应链
  • 高级:消息队列面试题精讲
  • 【学Rust写CAD】36 颜色插值函数(alpha256.rs补充方法)
  • Vue3实战二、搭建Vue3+ElementPlus项目教程
  • Scala 转义字符
  • AI赋能ArcGIS Pro——水系网络AI智能提取 | GIS人工智能制图技术解析
  • 洛谷 P3367 【模板】并查集 C++
  • 李成钢:近期个别经济体实施所谓“对等关税”,严重违反世贸组织规则
  • 师爷、文士、畸人:会稽范啸风及其著述
  • 王伟妻子人民日报撰文:81192,一架永不停航的战机
  • 一个多月来上海交大接连“牵手”三区,在这些方面进行区校合作
  • 被前男友泼汽油致残后,一个女孩经历的双重灼烧
  • 王征、解宁元、牛恺任西安市副市长