spring中怎么通过注解切换多数据源
发表于:2025-02-02 作者:千家信息网编辑
千家信息网最后更新 2025年02月02日,spring中怎么通过注解切换多数据源,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。第一步,配置数据源
千家信息网最后更新 2025年02月02日spring中怎么通过注解切换多数据源
spring中怎么通过注解切换多数据源,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。
第一步,配置数据源
第二步,定义用来切库的注解,和枚举类
@Target({ElementType.METHOD})@Retention(RetentionPolicy.RUNTIME)public @interface Dataswitch { Datatype value() default Datatype.master;}public enum Datatype { master("masterDataSource"),slave("slaveDataSource"); private String value; Datatype(String name){ this.value = name; } public String getValue() { return value; } public void setValue(String value) { this.value = value; }}
第三步,定义一个当前线程的变量的工具类,用于设置对应的数据源名称
public class DynamicDataSourceHolder { private static final ThreadLocalthreadLocal = new ThreadLocal (); public static String getThreadLocal() { return threadLocal.get(); } public static void setThreadLocal(String name) { threadLocal.set(name); } public static void clear(){ threadLocal.remove(); }}
第四步,创建AbstactRoutingDataSource的子类,重写determineCurrentLockupKey方法
public class DynamicDataSource extends AbstractRoutingDataSource{ protected Object determineCurrentLookupKey() { System.out.println(DynamicDataSourceHolder.getThreadLocal()); return DynamicDataSourceHolder.getThreadLocal(); }}
第五步,将多数据源配置到用我们创建的DynamicDataSource
第六步,配置切面,在操作数据库方法之前,获取注解配置的数据源名称,返回
@Component@Aspect@Order(0)public class DataSourceAspect { @Pointcut("execution (* xin.youhuila.sorceswitch.service..*(..))") public void aspect(){ } @Before("aspect()") public void before(JoinPoint joinPoint){ Class> clazz = joinPoint.getTarget().getClass(); Method[] method = clazz.getMethods(); Dataswitch dataswitch = null; boolean is = false; for(Method m:method){//此处最好改成通过签名获取调用方法是否含有注解,而不是遍历每个方法,可参考http://www.gitout.cn/?p=2398 if(m.isAnnotationPresent(Dataswitch.class)){ dataswitch = m.getAnnotation(Dataswitch.class); DynamicDataSourceHolder.setThreadLocal(dataswitch.value().getValue()); is = true; } } if(!is){ DynamicDataSourceHolder.setThreadLocal(Datatype.master.getValue()); } } @After("aspect()") public void after(){ DynamicDataSourceHolder.clear(); }}
第七步,使用
@Servicepublic class DemoService { @Autowired DemoMapper demoMapper; @Dataswitch(Datatype.master) public void select(){ Listd = demoMapper.select(); for(Demo demo:d){ System.out.println(demo); } }}
--------------------------------http://www.gitout.cn/?p=2398文章实现-----------------------
/** * 数据源切面 */@Aspect@Componentpublic class DynamicDataSourceAspect { @Pointcut("@annotation(com...datasource.DynamicDataSourceAnnotation)") public void pointCut() { } @Before("pointCut()") public void testBefore(JoinPoint point) { // 获得当前访问的class Class> className = point.getTarget().getClass(); DynamicDataSourceAnnotation dataSourceAnnotation = className.getAnnotation(DynamicDataSourceAnnotation.class); String dataSource = DataSourceConst.DB_ACTIVITY; // 优先级: 方法 > 类 > DB_ACTIVITY if(dataSourceAnnotation != null) { dataSource = dataSourceAnnotation.dataSource(); } String methodName = point.getSignature().getName(); // 得到方法的参数的类型 Class>[] argClass = ((MethodSignature) point.getSignature()).getParameterTypes(); try { Method method = className.getMethod(methodName, argClass); if (method.isAnnotationPresent(DynamicDataSourceAnnotation.class)) { DynamicDataSourceAnnotation annotation = method.getAnnotation(DynamicDataSourceAnnotation.class); dataSource = annotation.dataSource(); } } catch (Exception e) { e.printStackTrace(); } DataSourceContextHolder.setDataSourceType(dataSource); } @After("pointCut()") public void testAfter(JoinPoint point) { // 获得当前访问的class Class> className = point.getTarget().getClass(); DynamicDataSourceAnnotation dataSourceAnnotation = className.getAnnotation(DynamicDataSourceAnnotation.class); if (dataSourceAnnotation != null) { // 获得访问的方法名 String methodName = point.getSignature().getName(); // 得到方法的参数的类型 Class>[] argClass = ((MethodSignature) point.getSignature()).getParameterTypes(); String dataSource = DataSourceConst.DB_ACTIVITY; try { Method method = className.getMethod(methodName, argClass); if (method.isAnnotationPresent(DynamicDataSourceAnnotation.class)) { DynamicDataSourceAnnotation annotation = method.getAnnotation(DynamicDataSourceAnnotation.class); dataSource = annotation.dataSource(); } } catch (Exception e) { e.printStackTrace(); } if (dataSource != null && !DataSourceConst.DB_ACTIVITY.equals(dataSource)) { DataSourceContextHolder.clearDataSourceType(); } } }}
关于spring中怎么通过注解切换多数据源问题的解答就分享到这里了,希望以上内容可以对大家有一定的帮助,如果你还有很多疑惑没有解开,可以关注行业资讯频道了解更多相关知识。
方法
数据
数据源
注解
配置
问题
切换
切面
参数
名称
更多
类型
帮助
解答
易行
简单易行
优先级
内容
变量
子类
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
杨浦区推广软件开发价格信息
西固区网络安全培训基地
工业软件开发用什么语言和软件
欢迎网络技术有限公司
cad怎么解除连接服务器
数据库估算磁盘块读写次数
网络技术开发常见问题
微信小程序更改数据库添加项
图书管理专业考研数据库
大数据时代网络安全浅析
山西浪潮服务器维修调试云主机
医院数据库安全管理系统
归纳网络技术不断进步的影响
华为服务器不支持nvme启动
去重服务器
计算机二级网络技术是啥
有关网络安全的黑板报大学生
如何压缩mssql数据库大小
bop壹鱼互联网科技
出名的软件开发商
云服务器软件
上海滩下载软件开发
怎么安装数据库sql2019
关系数据库优缺点
软件开发计划里基线怎么写
太仓plm软件开发
永兴专业的电脑软件开发
网络安全需要什么专业知识
东莞有软件开发的公司吗
数据库对软件开发重要吗