Mybatis Plus动态指定数据源

Java开发中一个项目连接多个数据源时,可能会有需要动态指定一个方法所使用的数据源的场景。例如不同的用户查询不同的数据源。

我遇到的需求是这样的:设计一个公共的数据字典组件,该组件需要连接数据源,使用方引入该组件后可以直接调用组件提供的服务方法。如果使用方有多个数据源,那么组件就不知道该使用哪个数据源了,使用方又不能修改组件的源码,因此需要通过配置来实现运行时指定数据源。

实现代码如下:

  1. 扩展mybatis plus的数据源处理类,使其支持Spring EL表达式。

    import com.baomidou.dynamic.datasource.processor.DsProcessor;
    import org.aopalliance.intercept.MethodInvocation;
    import org.springframework.beans.factory.config.BeanExpressionContext;
    import org.springframework.beans.factory.config.BeanExpressionResolver;
    import org.springframework.beans.factory.config.ConfigurableListableBeanFactory;
    import org.springframework.context.expression.StandardBeanExpressionResolver;
    
    public class DsSpelExpressionProcessor extends DsProcessor {
        private ConfigurableListableBeanFactory beanFactory;
    
        public DsSpelExpressionProcessor(ConfigurableListableBeanFactory beanFactory) {
            this.beanFactory = beanFactory;
        }
    
        @Override
        public boolean matches(String key) {
            return true;
        }
    
        @Override
        public String doDetermineDatasource(MethodInvocation invocation, String key) {
            BeanExpressionResolver resolver = beanFactory.getBeanExpressionResolver();
            if (resolver == null) {
                resolver = new StandardBeanExpressionResolver();
            }
            BeanExpressionContext expressionContext = new BeanExpressionContext(beanFactory, null);
            Object result = resolver.evaluate(key, expressionContext);
            return result.toString();
        }
    }
    
  2. 配置类中声明这个Bean。

    @Configuration
    public class DsConfiguration {
    
        @Autowired
        private ConfigurableListableBeanFactory beanFactory;
    
        @Bean
        @ConditionalOnMissingBean
        public DsProcessor dsProcessor() {
            DsHeaderProcessor headerProcessor = new DsHeaderProcessor();
            DsSessionProcessor sessionProcessor = new DsSessionProcessor();
            DsSpelExpressionProcessor spelExpressionProcessor = new DsSpelExpressionProcessor(beanFactory);
            headerProcessor.setNextProcessor(sessionProcessor);
            sessionProcessor.setNextProcessor(spelExpressionProcessor);
            return headerProcessor;
        }
    }
    
  3. 创建Spring Boot配置类,供使用方自定义组件的数据源。

    @ConfigurationProperties(prefix = "jz.component.directory")
    @Component("jzCommonDirectoryConfigurationProperties")
    @Getter
    @Setter
    public class JzCommonDirectoryConfigurationProperties {
        /** 数据源名称,指定common_directory表所在数据源 */
        private String datasourceName;
    }
    
  4. 在组件对外提供的接口上指定数据源。

    @Service
    @DS("#{jzCommonDirectoryConfigurationProperties.datasourceName}")
    public class JzCommonDirectoryManagerImpl implements IJzCommonDirectoryManager {
    }
    
  5. 大功告成!

    使用方引入该组件后,在application.yml配置文件中配置好数据源名称(对应mybatis plus多数据源配置的数据源名称),组件就可以正常工作了。

    jz:
      component:
        config:
          datasource-name: "biz"
    

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

国内镜像android studio

Android SDK在线更新镜像服务器 1.中国科学院协会镜像站: 部分地区无法使用 ◦IPV4/IPV6: mirrors.opencas.cn 端口:80 ◦IPV4/IPV6: mirrors.opencas.org 端口:80 ◦IPV4/IPV6: mirrors.opencas.ac.cn 端口:80 2.上海GDG镜像服务器地址…

Ubuntu上安装MySQL并且实现远程登录

目录 下载网络工具 查看网络连接 更新系统软件包; 安装mysql数据库 查看mysql数据库状态 以数字ip形式显示mysql的监听状态。(默认监听端口是3306) 查看安装mysql数据库时系统创建的目录信息。 根据查询到的系统用户名以及随机密码&a…

从零开始认识显卡

显卡(GPU,全称为Graphics Processing Unit),是电脑中专门负责图形处理的硬件组件。以下是从零开始认识显卡的简单介绍: 1. 显卡的基本组成 显卡通常由以下几个主要部分组成: GPU核心:显卡的“…

mac安装Pytest、Allure、brew

安装环境 安装pytest 命令 pip3 install pytest 安装allure 命令:brew install allure 好吧 那我们在安装allure之前 我们先安装brew 安装brew 去了官网复制了命令 还是无法下载 如果你们也和我一样可以用这个方法哦 使用国内的代码仓库来执行brew的安装脚本…

【Vue】 npm install amap-js-api-loader指南

前言 项目中的地图模块突然打不开了 正文 版本太低了,而且Vue项目就应该正经走项目流程啊喂! npm i amap/amap-jsapi-loader --save 官方说这样执行完,就这结束啦!它结束了,我还没有,不然不可能记录这篇文…

三极管工作原理,以及小电流,如何驱动大电流

因为研究【自动下载电路实现】,涉及到三极管内容,之前看过,现在回看之前的笔记,一点印象都没了,于是,想了个办法,记住它 个人联想,不喜绕道,只是帮助个人记忆的 标题也是…

一文了解倾斜摄影

倾斜摄影是通过从一个垂直、四个倾斜、五个不同的视角同步采集影像,获取到丰富的建筑物顶面及侧视的高分辨率纹理。它不仅能够真实地反映地物情况,高精度地获取物方纹理信息,还可通过先进的定位、融合、建模等技术,生成真实的三维…

浅谈,华为切入具身智能赛道

近期,全球具身智能大模型(机器人“通用大脑”)赛道热闹非凡,科技大厂、初创公司接连发布重磅消息。 国外: 10月底,美国科技巨头【Meta】旗下基础人工智能研究 (FAIR)公布公司触摸感…

Spring |(二)IOC相关内容 | bean

文章目录 📚bean基础配置🐇bean的id和class🐇bean的name属性🐇bean作用范围scope配置🐇bean基础配置小结 📚bean实例化🐇构造方法实例化(常用)🐇静态工厂实例…

网络安全-企业环境渗透2-wordpress任意文件读FFmpeg任意文件读

一、 实验名称 企业环境渗透2 二、 实验目的 【实验描述】 操作机的操作系统是kali 进入系统后默认是命令行界面 输入startx命令即可打开图形界面。 所有需要用到的信息和工具都放在了/home/Hack 目录下。 本实验的任务是通过外网的两个主机通过代理渗透到内网的两个主机。…

Java 对象头、Mark Word、monitor与synchronized关联关系以及synchronized锁优化

1. 对象在内存中的布局分为三块区域: (1)对象头(Mark Word、元数据指针和数组长度) 对象头:在32位虚拟机中,1个机器码等于4字节,也就是32bit,在64位虚拟机中&#xff0…

Linux 进程概念与进程状态

目录 1. 冯诺依曼体系结构2. 操作系统(Operator System)2.1 概念2.2 设计OS的目的2.3 系统调用和库函数概念 3. 进程概念3.1 描述进程 - PCB3.2 task_struct3.3 查看进程3.4 通过系统调用获取进程标识符PID, PPID3.5 通过系统调用创建fork 4.…

计算机网络(14)ip地址超详解

先看图: 注意看第三列蓝色标注的点不会改变,A类地址第一个比特只会是0,B类是10,C类是110,D类是1110,E类是1111. IPv4地址根据其用途和网络规模的不同,分为五个主要类别(A、B、C、D、…

shell脚本启动springboot项目

nohup java -jar springboot.jar > springboot.log 2>&1 & 表示日志输出重定向到springboot.log日志文件, 而原本的日志继续输出到 项目同级的log文件夹下, 所以这个重定向没必要. 我们没必要要2分日志 #!/bin/bash# 获取springboot项目的进程ID PID$(ps -e…

51c大模型~合集76

我自己的原文哦~ https://blog.51cto.com/whaosoft/12617524 #诺奖得主哈萨比斯新作登Nature,AlphaQubit解码出更可靠量子计算机 谷歌「Alpha」家族又壮大了,这次瞄准了量子计算领域。 今天凌晨,新晋诺贝尔化学奖得主、DeepMind 创始人哈萨…

FileProvider高版本使用,跨进程传输文件

高版本的android对文件权限的管控抓的很严格,理论上两个应用之间的文件传递现在都应该是用FileProvider去实现,这篇博客来一起了解下它的实现原理。 首先我们要明确一点,FileProvider就是一个ContentProvider,所以需要在AndroidManifest.xml里面对它进行声明: <provideran…

【Java】二叉树:数据海洋中灯塔式结构探秘(上)

个人主页 &#x1f339;&#xff1a;喜欢做梦 二叉树中有一个树&#xff0c;我们可以猜到他和树有关&#xff0c;那我们先了解一下什么是树&#xff0c;在来了解一下二叉树 一&#x1f35d;、树型结构 1&#x1f368;.什么是树型结构&#xff1f; 树是一种非线性的数据结构&…

网口输出的加速度传感器

一、功能概述 1.1 设备简介 本模块为了对电机、风机、水泵等旋转设备进行预测性运维而开发&#xff0c;只需一个模块&#xff0c; 就可以采集旋转设备的 3 路振动信号&#xff08;XYZ 轴&#xff09;和一路温度信号&#xff0c;防护等级 IP67 &#xff0c;能够 适应恶劣的工业…

力扣面试经典 150(上)

文章目录 数组/字符串1. 合并两个有序数组2. 移除元素3. 删除有序数组中的重复项4. 删除有序数组的重复项II5. 多数元素6. 轮转数组7. 买卖股票的最佳时机8. 买卖股票的最佳时机II9. 跳跃游戏10. 跳跃游戏II11. H 指数12. O(1)时间插入、删除和获取随机元素13. 除自身以外数组的…

浅谈 proxy

应用场景 Vue2采用的defineProperty去实现数据绑定&#xff0c;Vue3则改为Proxy&#xff0c;遇到了什么问题&#xff1f; - 在Vue2中不能检测数组和对象的变化 1. 无法检测 对象property 的添加或移除 var vm new Vue({data:{a:1} })// vm.a 是响应式的vm.b 2 // vm.b 是…