Spring aop 通过获取代理对象实现事务切换
在我的项目中,波及到同一个类中一个办法调用另外一个办法,并且两个办法的事务不相干。
这外面波及到一个事务切换的问题,通过spring aop类外面的AopContext类获取以后类的代理对象,这样就能切换对应的事务管理器了,具体做法如下:
1. 配置
1.1 在applicationContext.xml文件中配置如下:
<!-- 开启裸露Aop代理到ThreadLocal反对 --> <aop:aspectj-autoproxy expose-proxy="true"/>
1.2 在所在类或者启动类上配置@EnableAspectJAutoProxy注解
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
2. 应用办法
在须要切换的中央获取代理对象,再调用对应的办法,如下:
((类名) AopContext.currentProxy()).办法();
3. 留神点
- AopContext.currentProxy()的实质是应用的ThreadLocal生成本地代理,这样的做法可能影响性能。
被代理对象应用的办法必须是public类型的办法,不然获取不到代理对象,会报上面的谬误:
java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
开启裸露AOP代理即可。
因为开启事务和事务回滚,理论这个过程是aop代理帮忙实现的,当调用一个办法时,它会先查看时候有事务,有则开启事务。
当调用本类的办法时,它并没有将其视为proxy调用,而是办法的间接调用,所以也就没有查看该办法是否含有事务这个过程,
那么本地办法调用的事务也就有效了。
4. demo
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)public class TransactionTest { /** * 办法A没事务 * * @param * @return void */ public String A(){ System.out.println("A办法执行开始!!!"); //生成TransactionTest代理类,再调用B办法,B的事务就回独自失效,并且异样回滚 String result = ((TransactionTest)AopContext.currentProxy()).B(); System.out.println("A办法执行完结!!!"); return result; } /** * 事务B独自的事务 * 应用代理,同一类中A办法调用B办法事务能够失效 * @param * @return void */ @Transactional(rollbackFor = Exception.class) public String B(){ return "事务B触发胜利!!!"; }}