阅读源码解析dynamic-datasource-spring-boot-starter中是如何动态切换数据源的

dynamic-datasource-spring-boot-starter是苞米豆提供的一个动态切换数据源的工具,可以帮助企业或者个人实现多数据源的切换,这里通过阅读源码的方式解析是如何动态的切换数据源的,采用的版本是3.5.1

源码解析

通过官方文档可以看到,如果想要动态的切换数据源,就需要在类或者方法上加上@DS注解

img

加上这个注解以后通过aop就可以拦截且识别到dsName究竟是什么,然后将其存储在ThreadLocal中
在这里插入图片描述
这个ThreadLocal中存储的是一个队列,我认为存储队列的目的是对应官方文档中的“就近原则”
在这里插入图片描述

再来看到DynamicRoutingDataSource这个实现类,找到determineDataSource这个方法,可以看到实际上他是实现方法,点击左边的绿色小图标

在这里插入图片描述

看完以后就知道了,实际上这个就是数据库连接,根据这个数据源获取相应的数据库连接然后进行相应的操作

在这里插入图片描述

再回到determineDataSource这个方法上,可以看到他是获取到队列中的第一个元素,然后再去map中获取相应的数据源,那么再去看看这个getDataSource方法

在这里插入图片描述

点开以后看到实际上这个是有一个dataSourceMap的map,里面存储着各种数据源,那么疑问来了,这些数据源是什么时候被put进这个map里面的

在这里插入图片描述

如果仔细观察可以发现实际上DynamicRoutingDataSource这个类实现了InitializingBean这个接口(具体什么作用可以自己搜索)然后调用了afterPropertiesSet这个方法,在bean被创建完了以后就会调用这个方法,于是数据源是什么时候被put进这个map了

在这里插入图片描述

我们知道实际上,动态切换数据源是通过yaml文件的相关配置进行加载数据源的,那么加载数据源的这一步实际上也在afterPropertiesSet这个方法里面

在这里插入图片描述

点进去以后发现这是一个接口有两个实现类,选择yml这个实现类来看下

在这里插入图片描述

进来以后发现loadDataSources这个方法就是用于加载数据源的,可以看到他在这个方法里面传入了一个Map<String, DataSourceProperty> dataSourcePropertiesMap,点进这个方法里面

在这里插入图片描述

这while循环里面的内容就是用于加载数据源了,根据传入进来的存储着数据源配置类的map,遍历map里面的数据源配置类然后加载数据源

在这里插入图片描述

这个map里面的数据源配置类又是根据依赖注入注入进来的

在这里插入图片描述
最后,在获取完了数据源以后不要忘了aop里面的方法是环绕方法,由于遵循就近原则,最后会将队列里面的内容弹出,获取下一个数据源

完整流程

最后贴上一张完整的流程图,如果有不正确的地方还请各位指正
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/26419.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue 和 js写屏幕自适应

实现屏幕自适应的方式有很多种&#xff0c;可以通过插件本身提供的方法&#xff0c;可以通过flex布局等&#xff0c;今天我们来写写通过js实现屏幕自适应。 以下是在vue中实现的屏幕自适应 首先在data中定义一下屏幕的默认大小和缩放比例 然后在mounted中获取窗口的内置宽高&a…

揭秘软件测试秘籍:测试用例设计方法大揭秘

文章目录 引言一、等价类划分1.1 定义1.2 步骤1.3 等价类划分优点和缺点 二、边界值分析法2.1 定义2.2 步骤2.3 边界值分析法的优点和缺点 三、判定表法3.1 定义3.2 步骤3.3 判定表组成不分3.4 判定表的优点和缺点 四、正交实验法4.1 定义4.2 步骤4.3 正交实验法的优点和缺点 五…

2024.05.31 校招 实习 内推 面经

绿*泡*泡VX&#xff1a; neituijunsir 交流*裙 &#xff0c;内推/实习/校招汇总表格 1、实习 | 上汽集团零束科技2024「ZONE引擎」&#xff08;内推&#xff09; 实习 | 上汽集团零束科技2024「ZONE引擎」计划正式启动&#xff08;内推&#xff09; 2、实习 | 华为上海海思…

基于Verilog表达的FSM状态机

基于Verilog表达的FSM状态机 1 FSM1.1 Intro1.2 Why FSM?1.3 How to do 在这里聚焦基于Verilog的三段式状态机编程&#xff1b; 1 FSM 1.1 Intro 状态机是一种代码实现功能的范式&#xff1b;一切皆可状态机&#xff1b; 状态机编程四要素&#xff1a;– 1.状态State&#…

基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真+程序+设计报告+讲解视频)

基于51单片机的简易温控水杯恒温杯仿真设计( proteus仿真程序设计报告讲解视频&#xff09; 仿真图proteus7.8及以上 程序编译器&#xff1a;keil 4/keil 5 编程语言&#xff1a;C语言 设计编号&#xff1a;S0099 1. 主要功能&#xff1a; 基于51单片机的简易温控水杯恒温…

Hudi extraMetadata 研究总结

前言 研究总结 Hudi extraMetadata ,记录研究过程。主要目的是通过 extraMetadata 保存 source 表的 commitTime (checkpoint), 来实现增量读Hudi表写Hudi表时,保存增量读状态的事务性,实现类似于流任务中的 exactly-once 背景需求 有个需求:增量读Hudi表关联其他Hudi…

cuda 架构设置

import torch torch.cuda.get_device_capability(0) 添加cmake options&#xff1a; -DCMAKE_CUDA_ARCHITECTURES86 -DCMAKE_CUDA_COMPILER/usr/local/cuda-11.8/bin/nvcc cmake工程出现“CMAKE_CUDA_ARCHITECTURES must be non-empty if set.“的解决方法_failed to detec…

振动棒出口欧盟CE认证测试项目介绍

振动棒出口欧盟CE认证测试项目介绍 一、CE认证概述 CE认证是欧盟市场的一种强制性认证&#xff0c;主要用于确保产品符合欧盟内的基本安全、健康和环保要求。对于许多产品&#xff0c;特别是电子电气产品&#xff0c;CE标志是进入欧盟市场的必要条件。振动棒作为成人用品&…

【附带源码】机械臂MoveIt2极简教程(六)、第三个demo -机械臂的避障规划

系列文章目录 【附带源码】机械臂MoveIt2极简教程(一)、moveit2安装 【附带源码】机械臂MoveIt2极简教程(二)、move_group交互 【附带源码】机械臂MoveIt2极简教程(三)、URDF/SRDF介绍 【附带源码】机械臂MoveIt2极简教程(四)、第一个入门demo 【附带源码】机械臂Move…

中介子方程十四

X$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXαXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XFX$XEXyXαXiX$XαXiXrXkXtXyX$XpXVX$XdXuXWXαXWXuXdX$XVXpX$XyXtXkXrXiXαX$XiXαXyXEX$XαXηXtXαX$XWXyX$XyXWX$XpXαXqXηX$XeXαXhX$XdX$XpX$XdX$XyXeXαX$XEXyXαXiX$XαXiX…

Java 获取客户端 IP 地址【工具类】

Java 获取客户端 IP 地址 import javax.servlet.http.HttpServletRequest; import java.net.InetAddress;/*** 网络工具类*/ public class NetUtils {/*** 获取客户端 IP 地址** param request 请求* return {link String}*/public static String getIpAddress(HttpServletReq…

Apache Flink 如何保证 Exactly-Once 语义

一、引言 在大数据处理中&#xff0c;数据的一致性和准确性是至关重要的。Apache Flink 是一个流处理和批处理的开源平台&#xff0c;它提供了丰富的语义保证&#xff0c;其中之一就是 Exactly-Once 语义。Exactly-Once 语义确保每个事件或记录只被处理一次&#xff0c;即使在…

源码编译构建LAMP

Apache 起源 源于A Patchy Server&#xff0c;著名的开源Web服务软件1995年时&#xff0c;发布Apache服务程序的1.0版本由Apache软件基金会&#xff08;ASF)负责维护最新的名称为“Apache HTTP Server”官方站点&#xff1a;http://httpd.apache.org/ 主要特点 开发源代码/…

Mysql union语句

开源项目SDK&#xff1a;https://github.com/mingyang66/spring-parent 个人文档&#xff1a;https://mingyang66.github.io/raccoon-docs/#/ mysql union操作符用于连接两个以上的select语句的结果组合到一个结果集&#xff0c;并去除重复的行&#xff0c;每个select语句的雷叔…

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException异常问题如何解决?

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: SELECT command denied to user XXXXXXX for table sys_users这是一个 MySQL 权限问题&#xff0c;表示用户 “XXXXXX” 没有对表 “sys_users” 执行 SELECT 操作的权限。 解决方案&#xff1a; 检查用户权限&am…

【课程总结】Day8(上):深度学习基本流程

前言 在上一篇课程《【课程总结】Day7&#xff1a;深度学习概述》中&#xff0c;我们了解到&#xff1a; 模型训练过程→本质上是固定w和b参数的过程&#xff1b;让模型更好→本质上就是让模型的损失值loss变小&#xff1b;让loss变小→本质上就是求loss函数的最小值&#xf…

函数用于将字符串反转以及函数的作用

在C语言中&#xff0c;你可以通过交换字符串中字符的位置来实现字符串的反转。以下是一个简单的函数示例&#xff0c;用于反转一个字符串&#xff1a; c复制代码 #include <stdio.h> #include <string.h> void reverse_string(char *str) { char *start str;…

【深度学习】深入解码:提升NLP生成文本的策略与参数详解

文章目录 解码策略解码参数公式解释代码例子区别 更详细的束搜索的解释更详细的例子解释第一步第二步第三步 解码策略和解码参数在自然语言处理&#xff08;NLP&#xff09;模型的生成过程中起着不同的作用&#xff0c;但它们共同决定了生成文本的质量和特性。 解码策略 解码…

史上最全盘点:一文告诉你什么是erp?erp系统厂商分别有哪些?

✅ 什么是ERP&#xff1f; ERP是Enterprise Resource Planning&#xff08;企业资源计划&#xff09;的简称&#xff0c;ERP是针对物资资源管理&#xff08;物流&#xff09;、人力资源管理&#xff08;人流&#xff09;、财务资源管理&#xff08;资金流&#xff09;、信息资…

人工智能与图像识别:深度融合的新趋势

人工智能与图像识别正呈现深度融合的新趋势&#xff0c;这一趋势主要体现在以下几个方面&#xff1a; 深度学习技术的推动&#xff1a; 深度学习作为人工智能的重要分支&#xff0c;为图像识别提供了强大的技术支持。尤其是卷积神经网络&#xff08;CNN&#xff09;的发展&…