第八章 springboot + mybatis + 多数据源3(使用切面AOP)
引入 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)的更多相关文章
- 第八章 springboot + mybatis + 多数据源(转载)
本篇博客转发自:http://www.cnblogs.com/java-zhao/p/5413845.html 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构 ...
- 第八章 springboot + mybatis + 多数据源2(解决循环引用)
解决了循环引用 1.application.properties #the first datasource jdbc.names:1,2 jdbc1.driverClassName = com.my ...
- 第八章 springboot + mybatis + 多数据源
http://www.cnblogs.com/java-zhao/p/5413845.html
- 第九章 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- 【第九章】 springboot + mybatis + 多数据源 (AOP实现)
在第八章 springboot + mybatis + 多数据源代码的基础上,做两点修改 1.ShopDao package com.xxx.firstboot.dao; import org.spr ...
- spring-boot (四) springboot+mybatis多数据源最简解决方案
学习文章来自:http://www.ityouknow.com/spring-boot.html 配置文件 pom包就不贴了比较简单该依赖的就依赖,主要是数据库这边的配置: mybatis.confi ...
- springboot + mybatis + 多数据源
此文已由作者赵计刚薪授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验 在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1) ...
- springboot mybatis 多数据源配置
首先导入mybatis等包,这里就不多说. 下面是配置多数据源和mybatis,每个数据源对应一套mybatis模板 数据源1: package com.aaaaaaa.config.datasour ...
- 【第八章】 springboot + mybatis + 多数据源
在实际开发中,我们一个项目可能会用到多个数据库,通常一个数据库对应一个数据源. 代码结构: 简要原理: 1)DatabaseType列出所有的数据源的key---key 2)DatabaseConte ...
随机推荐
- python3开发进阶-Django框架中的ORM的常用(增,删,改,查)操作
阅读目录 如何在Django终端打印SQL语句 如何在Python脚本中调用Django环境 操作方法 单表查询之神奇的下划线 ForeignKey操作 ManyToManyField 聚合查询和分组 ...
- CentOS正确关机方法(转)
CentOS正确关机方法 1关机前准备 1.1观察系统使用状态 · 谁在线:who · 联网状态:netstat -a · 后台执行的程序:ps -au ...
- Exercise02_09
import javax.swing.JOptionPane; public class Acceleration { public static void main(String[] args){ ...
- Android闪闪发光字体效果
原文: http://blog.csdn.net/xu_fu/article/details/24484019 import android.content.Context; import andro ...
- How can I create a dump of SQL Server?
https://blogs.msdn.microsoft.com/askjay/2009/12/29/basic-debugging-concepts-and-setup/ You can creat ...
- Linq 简明教程
一个简单的实例 static void Main(string[] args) { string[] names = { "Alonso", "Zheng", ...
- SQLSERVER调用DLL程序
在SQL Server中调用dll分为两个步骤 1.创建一个dll文件(dll文件分成3种类型,讲其中一种) 2.把dll文件放进SQL Server的程序集中.然后定义一个Function,就可以通 ...
- CocoaPods安装小步骤
CocoaPod的安装和使用步骤: 1.开启 terminal终端 2.移除现有 Ruby 默认源 $ gem sources --remove https://rubygems.org/ 3.使用新 ...
- C++发送HTTP请求---亲测可行(转)
转自:http://hi.baidu.com/benbearlove/item/1671c23017575825b3c0c53f 环境:xp sp3,vs2008,在静态库中使用 MFC #inclu ...
- Leagal or Not —— 拓扑排序(王道)
Problem Description ACM-DIY is a large QQ group where many excellent acmers get together. It is so h ...