Spring Boot 多数据源解决方案:dynamic-datasource-spring-boot-starter 的奥秘(上) 📅 发布时间:2026/7/7 4:14:57 👁️ 浏览次数: 在 Spring Boot 生态中dynamic-datasource-spring-boot-starter 是一个非常实用的组件它为我们在多数据源场景下提供了便捷的解决方案。在上一篇文章《一分钟上手如何创建你的第一个 Spring Boot Starter》中我们学习了如何创建自己的 starter今天我们就来深入探究下 dynamic-datasource-spring-boot-starter 的源码了解它是如何实现动态数据源切换功能的。一、dynamic-datasource-spring-boot-starter介绍dynamic-datasource-spring-boot-starter 是一个用于在 Spring Boot 项目中实现动态数据源切换的工具。在实际的应用开发中经常会遇到需要连接多个数据源的情况例如一个销售系统会根据不同的业务模块如线索、订单、库存、物流等连接到不同的数据库。手动管理多个数据源的切换和配置是一项复杂且容易出错的任务而这个 starter 就是为了解决这些问题而生。二、依赖的jar包1. SpringBoot相关依赖提供了JDBC数据库连接操作、AOP面向切面编程、Actuator应用监控、Web应用开发等功能Actuator和Web依赖都是可选的不是必须的。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-jdbc/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-aop/artifactId /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-actuator/artifactId optionaltrue/optional /dependency dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-starter-web/artifactId optionaltrue/optional /dependency2. MyBatis-Plus增强版的MyBatis框架可以极大简化数据库操作业务的mapper层只需要继承BaseMapper即可使用mybatis-plus提供的增删改查的API。使开发者能够更加专注于业务逻辑的实现而无需在复杂的 SQL 编写和数据库连接管理上耗费过多精力。该jar包也是可选的不是必须的。3. 连接池HikariCP、Druid、Beecp、Commons DBCP2等用于管理数据库连接。这些jar包也都是可选的后端开发使用的最多的还是Druid数据库连接池。dependency groupIdcom.zaxxer/groupId artifactIdHikariCP-java7/artifactId version${hikariCp.version}/version optionaltrue/optional /dependency dependency groupIdcom.alibaba/groupId artifactIddruid-spring-boot-starter/artifactId version${druid.version}/version optionaltrue/optional /dependency dependency groupIdcom.github.chris2018998/groupId artifactIdbeecp/artifactId version${beeCp.version}/version optionaltrue/optional /dependency dependency groupIdorg.apache.commons/groupId artifactIdcommons-dbcp2/artifactId version${dbcp2.version}/version optionaltrue/optional /dependency4. 配置处理器在开发阶段为IDE 提供辅助功能如代码提示和验证配置属性的正确性。在项目的实际运行时并不需要这个依赖来执行应用程序的核心逻辑所以也将其设置为可选避免了不必要的依赖传递减小了项目最终打包的体积。dependency groupIdorg.springframework.boot/groupId artifactIdspring-boot-configuration-processor/artifactId optionaltrue/optional /dependency5. P6Spy用于监控和调试SQL语句。可能在开发和测试环境中非常有用但在生产环境中可能不需要所以业将其标记为可选依赖让使用方根据实际情况决定是否引入。6. Seata提供分布式事务解决方案根据项目实际需要决定要不要引入所以该jar包也是可选的。三、DynamicDataSourceAutoConfiguration类剖析DynamicDataSourceAutoConfiguration类是dynamic-datasource-spring-boot-starter包的自动配置类整个动态数据源的配置和初始化都在这里。Configuration EnableConfigurationProperties({DynamicDataSourceProperties.class}) AutoConfigureBefore( value {DataSourceAutoConfiguration.class}, name {com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure} ) Import({DruidDynamicDataSourceConfiguration.class, DynamicDataSourceCreatorAutoConfiguration.class, DynamicDataSourceHealthCheckConfiguration.class}) ConditionalOnProperty( prefix spring.datasource.dynamic, name {enabled}, havingValue true, matchIfMissing true ) public class DynamicDataSourceAutoConfiguration { …… }这种配置类相关的注解之前的博客也分享过这里就不再赘述了我们重点来剖析下该配置类中的几个关键方法。1. dynamicDataSourceProvider方法用于创建动态数据源提供者 DynamicDataSourceProvider。其主要职责是根据配置文件中的数据源信息构建数据源对象并将其提供给动态数据源路由机制。Bean ConditionalOnMissingBean // 确保Spring容器中不存在 DynamicDataSourceProvider 类型的 Bean 时才创建该 Bean public DynamicDataSourceProvider dynamicDataSourceProvider() { MapString, DataSourceProperty datasourceMap this.properties.getDatasource(); return new YmlDynamicDataSourceProvider(datasourceMap); }2. dataSource方法用于是创建动态数据源 DynamicRoutingDataSource。它整合了各种配置信息包括默认数据源、严格模式、切换策略、数据源提供者以及与SQL语句监控和分布式事务相关的配置构建出一个完整的动态数据源对象使其能够在运行时根据不同条件动态切换数据源。Bean ConditionalOnMissingBean public DataSource dataSource(DynamicDataSourceProvider dynamicDataSourceProvider) { DynamicRoutingDataSource dataSource new DynamicRoutingDataSource(); // 默认数据源 dataSource.setPrimary(this.properties.getPrimary()); // 根据配置决定在数据源切换时是否进行严格检查以确保数据源的正确性和一致性。 dataSource.setStrict(this.properties.getStrict()); // 数据源切换策略如基于注解、基于配置文件或基于特定规则的切换策略 dataSource.setStrategy(this.properties.getStrategy()); dataSource.setProvider(dynamicDataSourceProvider); dataSource.setP6spy(this.properties.getP6spy()); dataSource.setSeata(this.properties.getSeata()); return dataSource; }3. dynamicDatasourceAnnotationAdvisor 方法负责创建动态数据源注解切面的Advisor。用于在方法执行时根据注解信息进行数据源切换。Role(2) Bean public Advisor dynamicDatasourceAnnotationAdvisor(DsProcessor dsProcessor) { DynamicDataSourceAnnotationInterceptor interceptor new DynamicDataSourceAnnotationInterceptor(this.properties.isAllowedPublicOnly(), dsProcessor); DynamicDataSourceAnnotationAdvisor advisor new DynamicDataSourceAnnotationAdvisor(interceptor); advisor.setOrder(this.properties.getOrder()); return advisor; }4. dynamicTransactionAdvisor 方法用于创建动态事务 Advisor。它定义了一个基于注解的事务切面用于在方法执行时管理事务确保数据库操作的原子性、一致性、隔离性和持久性。Role(2) ConditionalOnProperty( prefix spring.datasource.dynamic, name {seata}, havingValue false, matchIfMissing true ) Bean public Advisor dynamicTransactionAdvisor() { AspectJExpressionPointcut pointcut new AspectJExpressionPointcut(); pointcut.setExpression(annotation(com.baomidou.dynamic.datasource.annotation.DSTransactional)); return new DefaultPointcutAdvisor(pointcut, new DynamicLocalTransactionAdvisor()); }5. dsProcessor 方法用于创建数据源处理器 DsProcessor。数据源处理器负责根据不同的条件如请求头、会话信息、SpEL 表达式等确定要切换的数据源是实现动态数据源切换逻辑的关键组件之一。自动配置类剖析完了剩下的就是配置属性类DynamicDataSourceProperties和spring.factories 文件了。ConfigurationProperties( prefix spring.datasource.dynamic ) public class DynamicDataSourceProperties { private static final Logger log LoggerFactory.getLogger(DynamicDataSourceProperties.class); public static final String PREFIX spring.datasource.dynamic; public static final String HEALTH spring.datasource.dynamic.health; public static final String DEFAULT_VALID_QUERY SELECT 1; private String primary master; private Boolean strict false; private Boolean p6spy false; private Boolean seata false; private Boolean lazy false; private SeataMode seataMode; private boolean health; private String healthValidQuery; private MapString, DataSourceProperty datasource; private Class? extends DynamicDataSourceStrategy strategy; private Integer order; NestedConfigurationProperty private DruidConfig druid; NestedConfigurationProperty private HikariCpConfig hikari; NestedConfigurationProperty private BeeCpConfig beecp; NestedConfigurationProperty private Dbcp2Config dbcp2; private String publicKey; private boolean allowedPublicOnly; …… }DynamicDataSourceProperties一般都配置在Apollo中。以下是spring.factories文件。org.springframework.boot.autoconfigure.EnableAutoConfigurationcom.baomidou.dynamic.datasource.spring.boot.autoconfigure.DynamicDataSourceAutoConfiguration四、总结通过对 dynamic-datasource-spring-boot-starter 的剖析我们可以了解到它是实现动态数据源切换的机制。这一组件为开发者在处理多数据源场景时提供了极大的便利使得应用的可扩展性和可维护性得到了显著提升。
【C++ 为什么引用对象必须被初始化】 引用类型与值类型的初始化差异这是一个关于C中引用类型和值类型初始化的核心概念问题。基本概念引用 (Reference)别名:引用是另一个变量的别名,它必须绑定到一个已存在的对象必须初始化:引用在创建时必须初始化,之后不能再指向其他… 2026/7/5 9:52:43
查理·芒格的7个思维工具,让我少犯了90%的错 "我这辈子遇到的聪明人,没有不每天阅读的——一个都没有。" —— 查理芒格核心主旨查理芒格(Charlie Munger)的思维体系,本质是一套 "如何做决策"的操作手册。他的核心洞察非常简单:世界是复杂的&… 2026/7/6 19:16:35
官宣!可重构芯片应用研究院落地鄂尔多斯,为产业升级注入“芯”动能 初春3月,鄂尔多斯东胜区,一场特殊的签约仪式在此举行。由清微智能发起、东胜区国企参与设立的“鄂尔多斯清微智能可重构计算AI芯片应用研究院”正式成立。这是全国首家以国产自主可重构芯片为特点的AI应用示范基地,致力开展AI芯片产业应用研究… 2026/5/17 9:32:33
Spring AOP面向切面编程-从注解到实战 目录 一、学习背景与目标 1.1 学习背景 1.2 学习目标 二、核心概念与原理 2.1 AOP 是什么 2.2 五大核心概念 2.3 AOP 的底层原理 2.4 五种通知类型 三、逻辑图谱与对比 3.1 AOP 实现技术图谱 3.2 注解 AOP vs XML AOP 3.3 决策流程图 四、核心详解 4.1 基础环境搭… 2026/7/7 4:11:39
Spotify 引领 AI 编程变革:73% PR 由 AI 生成,代码标准化与全员原型开发成关键! 早见未来:代码增长催生自动化需求 去年 9 月,Anthropic Claude Code 创始人 Boris Cherny 与 Spotify 工程副总裁 Niklas Gustavsson 探讨 AI 编程工具未来。当时,Niklas 激进判断年底开发者或无需传统 IDE,Boris 认为这几乎不可能… 2026/7/7 4:07:38
如何高效利用猫抓Cat-Catch:浏览器资源嗅探扩展的终极实战指南 如何高效利用猫抓Cat-Catch:浏览器资源嗅探扩展的终极实战指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 猫抓Cat-Catch是一款基于… 2026/7/7 4:07:38
实时轮询 CSV 横向条形图:服务器负载监控分级预警可视化代码示列 完整可直接预览 HTML代码示例<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>服务器负载实时监控… 2026/7/7 4:07:38
7月6日ICML公布获奖名单:清华、MIT论文获杰出奖,扩散模型成大模型重要方向 清华、MIT论文获ICML杰出奖,扩散模型成大模型重要演进方向7月6日,全球机器学习领域三大顶会之一ICML公布获奖名单,来自清华大学和麻省理工学院的两篇与扩散模型相关的论文拿下杰出论文奖,这一奖项代表本届获奖论文中的最高水准。其… 2026/7/7 4:03:37
农业品牌策划设计公司怎么选?从东莞视维品牌(SIVIBRAND)看专业机构的服务逻辑 农业品牌化这几年明显提速——从"卖产品"走向"卖品牌",褚橙、三只松鼠、认养一头牛、东方甄选农品这些名字能打出来,背后都不是单纯靠产地红利,而是品牌定位、视觉体系、IP打造、包装体验、渠道推广整套动作一起上。对于… 2026/7/7 4:03:37
Acunetix v24.8 深度解析:DAST漏洞扫描器核心原理与DevSecOps实践 1. 项目概述:Acunetix v24.8 高级版漏洞扫描器深度解析作为一名在网络安全领域摸爬滚打多年的老兵,我深知一款趁手的“兵器”对于安全测试工作意味着什么。今天要聊的,就是Web应用安全测试领域里一个响当当的名字——Acunetix。特别是其v24.8… 2026/7/7 0:01:11
如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 如何3步搞定加密视频下载:跨平台资源嗅探与解密工具终极指南 【免费下载链接】res-downloader 视频号、小程序、抖音、快手、小红书、直播流、m3u8、酷狗、QQ音乐等常见网络资源下载! 项目地址: https://gitcode.com/GitHub_Trending/re/res-downloader 你是… 2026/7/7 0:03:13
Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 Jailhouse-gui可视化管理工具:让多核处理器分区变得简单高效 【免费下载链接】Jailhouse-gui A graphical user interface (GUI) tool for configuring and managing Jailhouse, a Linux-based hypervisor for partitioning multicore processors into isolated cel… 2026/7/7 0:03:13
6个月转型AI工程师:实战路径与核心技能 1. 项目概述:6个月转型AI工程师的可行性路径在2023年大模型技术爆发的背景下,AI工程师岗位需求同比增长217%(LinkedIn数据)。不同于传统算法工程师需要3-5年培养周期,现代AI工程师更侧重工程化落地能力。我在硅谷科技公… 2026/7/6 8:43:22
TPAFE0808与PIC18F87K22的多通道信号采集方案 1. 项目背景与核心需求在工业自动化、医疗设备和科研仪器等领域,多通道信号采集与系统监测是基础且关键的技术需求。传统方案往往面临通道数量不足、信号调理复杂、系统集成度低等问题。TPAFE0808作为一款8通道模拟前端芯片,与PIC18F87K22微控制器的组合… 2026/7/6 7:29:49
STC3115与PIC18LF26K80构建高精度电池管理系统 1. STC3115与PIC18LF26K80在电池管理系统中的核心价值在现代电子设备中,电池管理系统(BMS)的重要性不亚于设备的核心处理器。STC3115作为一款高精度电池电量监测IC,与PIC18LF26K80微控制器的组合,构成了一个既能精确监控又能智能管理的完整解… 2026/7/6 7:29:51