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

  1)添加坐标

    

注解指定数据源java 注解切换数据源_注解指定数据源java

   2)编写自定义拦截注解  

    

注解指定数据源java 注解切换数据源_测试类_02

   3)Aspect类

    

注解指定数据源java 注解切换数据源_测试类_03

   4)测试类:

    

注解指定数据源java 注解切换数据源_注解指定数据源java_04

   5)Service类:

    

注解指定数据源java 注解切换数据源_数据源_05

   测试结果:

    

注解指定数据源java 注解切换数据源_注解指定数据源java_06

    

注解指定数据源java 注解切换数据源_测试类_07

 补充注意:

  在上述步骤的第四步中将数据源选择注释后并没有直接在测试类中直接使用@RoutingWith注解,而是在第五步的Service服务中添加。如果不按这个添加使用注解加AOP方式进行动态数据源路由是失败的(亲测,切面类无效)。

现在项目的结构设计基本上是基于MVC的,那么数据库的操作集中在dao层完成,主要业务逻辑在service层处理,controller层处理请求。假设在执行dao层代码之前能够将数据源(DataSource)换成我们想要执行操作的数据源,那么这个问题就解决了。

    

注解指定数据源java 注解切换数据源_测试类_08

   对于使用Mybatis进行数据持久化操作,在SessionFactory实例化之前就应将数据源选择好。在示例的案例中,在测试类中选择数据源时,SessionFactory已经进行了实例化的操作(即数据源已经作为参数注入到sesionFactory对象)。