引入 aop包

        <dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

1.新建注解 DS

package com.example.abstractroutingdatasource.config;

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target; /** * 在方法上使用,用于指定使用哪个数据源 * * @version v.0.1 */ @Target({ ElementType.METHOD, ElementType.TYPE })
@Retention(RetentionPolicy.RUNTIME)
public @interface DS {
String value(); }

2.新建AOP  DataSourceAspect

package com.example.abstractroutingdatasource.config;

import com.sun.corba.se.impl.orb.DataCollectorBase;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component; @Aspect
@Order(-10)//保证该AOP在@Transactional之前执行
@Component
public class DataSourceAspect { /* * @Before("@annotation(ds)") * 的意思是:
* @Before:在方法执行之前进行执行: * @annotation(targetDataSource): * 会拦截注解targetDataSource的方法,否则不拦截; */ // @Before("execution(* com.example.*.dao..*.*(..))")
@Before("@annotation(ds)")
public void changeDataSource(JoinPoint point,DS ds) throws Throwable {
//获取当前的指定的数据源;
String dsId =ds.value();
//如果不在我们注入的所有的数据源范围之内,那么输出警告信息,系统自动使用默认的数据源。
DatabaseContextHolder.setDatabaseType(dsId); } @After("@annotation(ds)")
public void restoreDataSource(JoinPoint point, DS ds) { System.out.println("Revert DataSource : {} > {}"+ds.value()+point.getSignature()); //方法执行完毕之后,销毁当前数据源信息,进行垃圾回收。 DatabaseContextHolder.ClearDataBaseType(); } }

3.在dao 上加注解

package com.example.abstractroutingdatasource.dao;

import com.example.abstractroutingdatasource.config.DS;
import com.example.abstractroutingdatasource.config.DatabaseContextHolder;
import com.example.abstractroutingdatasource.entity.UcUser;
import com.example.abstractroutingdatasource.mapper.UcUserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository; import java.net.UnknownHostException; @Repository
public class UcUserDao { @Autowired
private UcUserMapper ucUserMapper; @DS(value="1")
public UcUser selectOne(String id,String ds ){
// DatabaseContextHolder.setDatabaseType(ds); //手动设置库
return ucUserMapper.getUser(id);
} @DS(value="2")
public UcUser selectOne2(String id,String ds ){
// DatabaseContextHolder.setDatabaseType(ds); //手动设置库
return ucUserMapper.getUser(id);
}
}

4.完成,启动应用访问页面 数据源会自动切换

demo 链接: https://pan.baidu.com/s/1rpC7lMxF_ENW_zLr7MGlBQ 

第八章 springboot + mybatis + 多数据源3(使用切面AOP)的更多相关文章

  1. 第八章 springboot + mybatis + 多数据源(转载)

    本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...

  2. 第八章 springboot + mybatis + 多数据源2(解决循环引用)

    解决了循环引用 1.application.properties #the first datasource jdbc.names:1,2 jdbc1.driverClassName = com.my ...

  3. 第八章 springboot + mybatis + 多数据源

    http://www.cnblogs.com/java-zhao/p/5413845.html

  4. 第九章 springboot + mybatis + 多数据源 (AOP实现)

    在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...

  5. 【第九章】 springboot + mybatis + 多数据源 (AOP实现)

    在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...

  6. spring-boot (四) springboot+mybatis多数据源最简解决方案

    学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...

  7. springboot + mybatis + 多数据源

    此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...

  8. springboot mybatis 多数据源配置

    首先导入mybatis等包,这里就不多说. 下面是配置多数据源和mybatis,每个数据源对应一套mybatis模板 数据源1: package com.aaaaaaa.config.datasour ...

  9. 【第八章】 springboot + mybatis + 多数据源

    在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseConte ...

随机推荐

  1. 1.8(学习笔记)监听器(Listener)

    一.监听器简介 监听器是web容器对某一些对象的监听,当某些对象发生创建.修改.删除的动作时, web容器会自动调用对应的监听器中的方法. 例如A是监听器,B是被监听对象,A的监听任务是B回家时来开门 ...

  2. 导出pem证书给服务端Push Notification使用

    1. 钥匙串创建Push证书的证书签名请求文件(CSR文件). 如下图所示: 2.创建App ID,创建Provisioning Profile,下载安装到XCode. 苹果开发者后台页面,创建Pus ...

  3. linux-排序-sort

    命令格式: sort [参数][源文件][-o 输出文件] 参数:  -b   忽略每行前面开始出的空格字符.  -c   检查文件是否已经按照顺序排序.  -f   排序时,忽略大小写字母.  -M ...

  4. awk-使用

    http://www.cnblogs.com/ggjucheng/archive/2013/01/13/2858470.html 命令格式: awk [-F field-separator] 'pat ...

  5. Linux批量管理工具Ansible

    Ansible-批量linux管理工具:https://github.com/ansible/ansible Ansible有如下优点: 1.轻量级,他不需要去客户端安装agent,更新时,只需要在操 ...

  6. 三星s3c24xx平台GPIO操作详解

    转:http://blog.chinaunix.net/uid-22030783-id-3391515.html 先介绍三星S3C24XX平台BSP中定义外设寄存器和GPIO的相关头文件 以linux ...

  7. java直接跳转页面

    public static String genForwardHtml(String url, Map<String, String> parameters, String charset ...

  8. Redis编程实践【pub/sub】

    原文:http://shift-alt-ctrl.iteye.com/blog/1867454 Redis或许已经在很多企业开始推广并试水,本文也根据个人的实践,简单描述一下Redis在实际开发过程中 ...

  9. CentOS--在CentOS安装PHP5.6

    查看centos的版本: [root@localhost ~]# lsb_release -a LSB Version:    :core-3.1-amd64:core-3.1-ia32:core-3 ...

  10. nodeJs的模块依赖

    1.require载入依赖 var http = require('http');//http为路径,可以忽略后缀 2.exports输出依赖 exports.add=add;//add为方法 3.只 ...