Spring Boot数据访问之动态数据源切换之使用注解式AOP优化
在Spring Boot数据访问之多数据源配置及数据源动态切换 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中详述了如何配置多数据源及多数据源之间的动态切换。但是需要读数据库的地方,就需要加上一大段RoutingDataSourceContext ctx = ...代码,使用起来十分不便。有没有方法可以简化呢?当然可以啦。
回顾一下声明式事务Spring AOP应用之一:声明式事务 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中可以利用@Transactional() 注解,放在某个Java方法上,这个方法就动具有了事务的功能。我们也可以编写类似的@RoutingWith("slaveDataSource")注解,放到某个方法上,这个方法内部就自动选择了对应的数据源。
参考Spring AOP基础概念及自定义注解拦截等方式初体验 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中自定义注解拦截方式,优化动态数据源的切换。具体操作如下:
1)添加坐标

2)编写自定义拦截注解

3)Aspect类

4)测试类:

5)Service类:

测试结果:


补充注意:
在上述步骤的第四步中将数据源选择注释后并没有直接在测试类中直接使用@RoutingWith注解,而是在第五步的Service服务中添加。如果不按这个添加使用注解加AOP方式进行动态数据源路由是失败的(亲测,切面类无效)。
为什么呢?这与动态选择数据源的实现原理有关:现在项目的结构设计基本上是基于MVC的,那么数据库的操作集中在dao层完成,主要业务逻辑在service层处理,controller层处理请求。假设在执行dao层代码之前能够将数据源(DataSource)换成我们想要执行操作的数据源,那么这个问题就解决了。

对于使用Mybatis进行数据持久化操作,在SessionFactory实例化之前就应将数据源选择好。在示例的案例中,在测试类中选择数据源时,SessionFactory已经进行了实例化的操作(即数据源已经作为参数注入到sesionFactory对象)。
Spring Boot数据访问之动态数据源切换之使用注解式AOP优化的更多相关文章
- Spring Boot数据访问之多数据源配置及数据源动态切换
如果一个数据库数据量过大,考虑到分库分表和读写分离需要动态的切换到相应的数据库进行相关操作,这样就会有多个数据源.对于一个数据源的配置在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的 ...
- 06.深入浅出 Spring Boot - 数据访问之Druid
代码下载:https://github.com/Jackson0714/study-spring-boot.git 一.Druid是什么? 1.Druid是数据库连接池,功能.性能.扩展性方面都算不错 ...
- 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)
MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...
- Spring Boot数据访问之整合Mybatis
在Mybatis整合Spring - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中谈到了Spring和Mybatis整合需要整合的点在哪些方面,需要将Mybatis中数据库连接池等相关对 ...
- Spring Boot数据访问之Druid连接池的配置
在Spring Boot数据访问之数据源自动配置 - 池塘里洗澡的鸭子 - 博客园 (cnblogs.com)中数据源连接池方式缺省(type)情况下默认使用HikariCP,那不缺省如何配置呢?我们 ...
- Spring Boot:实现MyBatis动态数据源
综合概述 在很多具体应用场景中,我们需要用到动态数据源的情况,比如多租户的场景,系统登录时需要根据用户信息切换到用户对应的数据库.又比如业务A要访问A数据库,业务B要访问B数据库等,都可以使用动态数据 ...
- Spring Boot + Mybatis多数据源和动态数据源配置
文章转自 https://blog.csdn.net/neosmith/article/details/61202084 网上的文章基本上都是只有多数据源或只有动态数据源,而最近的项目需要同时使用两种 ...
- Spring Boot数据访问之数据源自动配置
Spring Boot提供自动配置的数据访问,首先体验下,Spring Boot使用2.5.5版本: 1)导入坐标: 2.5.25版本支持8.0.26mysql数据库驱动.spring-boot-st ...
- Spring Boot 数据访问集成 MyBatis 与事物配置
对于软件系统而言,持久化数据到数据库是至关重要的一部分.在 Java 领域,有很多的实现了数据持久化层的工具和框架(ORM).ORM 框架的本质是简化编程中操作数据库的繁琐性,比如可以根据对象生成 S ...
随机推荐
- 安装TestNG
1.启动Eclipse,选择"Help"-->'Install New Software' 2.在谈出的弹框中选择"Add" 3.在弹出的"Ad ...
- lua中的三目运算符
开头先说结论 1.简单版三目运算符(需要自我保证"b"不为"false") a and b or c 2.通用版三目运算符 (a and {b} or {c}) ...
- http://dl-ssl.google.com/android上不去解决方案
转:https://blog.csdn.net/j04110414/article/details/44149653/ 一. 更新sdk,遇到了更新下载失败问题: Fetching https://d ...
- 解决twrp中内部存储为0MB的情况
本来打算给备用机红米4a刷个dotos的系统,结果忘记双清就刷了,然后进去系统也是直接黑屏,很神奇的是长按电源键能弹出dotos的关机选项.然后进去twrp准备双清在刷时,发现内部存储变成了0MB,然 ...
- 【记录一个问题】golang中使用sync.Pool反而造成了负优化
之前有这样的代码:从http收数据后,进行snappy解码: dst := make([]byte, 0, len(httpRequestData)*5) dst, err = snappy.Deco ...
- 【记录一个问题】linux + opencv + gpu视频解码,好不容易编译通过,运行又coredump了
1.首先编译了opencv + cuda 编译选项中使用了以下关于cuvid库的内容: //"nvcuvid" libraryCUDA_nvcuvid_LIBRARY:FILE ...
- 2022GDUT寒假专题学习-1 B,F,I,J题
专题链接:专题学习1 - Virtual Judge (vjudge.net) B - 全排列 题目 思想 这道题可以用DFS进行求解,但是一看到全排列,其实可以立刻想到一个STL函数:next_pe ...
- golang中自定义一些类型和对应类型的指针方法
package main import "fmt" // 项目开发中可以为type声明的类型编写一些方法,从而实现对象.方法的操作 // 声明类型 type myInt int / ...
- IoC容器-Bean管理(bean作用域)
IoC操作Bean管理(bean作用域) 1,在Spring里面,设置创建bean实例是单实例还是多实例 2,在Spring里面,默认情况下,bean是单实例对象 3,如何设置单实例还是多实例 (1) ...
- Rock Pi开发笔记(一):Rock Pi系列arm产品方案快速落地方案介绍
前言 开发RK3399等相关的项目和产品做评估,最近发现Rock Pi4是一个很好的评估版,价格合适,能满足评估的开发,像树莓派一样留出来引脚接口,是很好的快速落地arm系列产品和项目的较好方案选 ...