Spring aop 通过获取代理对象实现事务切换
2017-08-11 18:51
731 查看
摘要:在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关,
这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识,
答案是:通过spring aop类里面的AopContext类获取当前类的代理对象,
这样就能切换对应的事务管理器了,具体做法如下:
(1).在applicationContext.xml文件中配置如下:
[html] view
plain copy
<!-- 开启暴露Aop代理到ThreadLocal支持 -->
<aop:aspectj-autoproxy expose-proxy="true"/>
(2).在需要切换的地方获取代理对象,再调用对应的方法,如下:
[java] view
plain copy
((类名) AopContext.currentProxy()).方法();
(3).注意,这里需要被代理对象使用的方法必须是public类型的方法,不然获取不到代理对象,会报下面的错误:
[java] view
plain copy
java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
开启暴露AOP代理即可.
因为开启事务和事务回滚,实际这个过程是aop代理帮忙完成的,当调用一个方法时,它会先检查时候有事务,有则开启事务,
当调用本类的方法是,它并没有将其视为proxy调用,而是方法的直接调用,所以也就没有检查该方法是否含有事务这个过程,
那么本地方法调用的事务也就无效了。
这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识,
答案是:通过spring aop类里面的AopContext类获取当前类的代理对象,
这样就能切换对应的事务管理器了,具体做法如下:
(1).在applicationContext.xml文件中配置如下:
[html] view
plain copy
<!-- 开启暴露Aop代理到ThreadLocal支持 -->
<aop:aspectj-autoproxy expose-proxy="true"/>
(2).在需要切换的地方获取代理对象,再调用对应的方法,如下:
[java] view
plain copy
((类名) AopContext.currentProxy()).方法();
(3).注意,这里需要被代理对象使用的方法必须是public类型的方法,不然获取不到代理对象,会报下面的错误:
[java] view
plain copy
java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.
开启暴露AOP代理即可.
因为开启事务和事务回滚,实际这个过程是aop代理帮忙完成的,当调用一个方法时,它会先检查时候有事务,有则开启事务,
当调用本类的方法是,它并没有将其视为proxy调用,而是方法的直接调用,所以也就没有检查该方法是否含有事务这个过程,
那么本地方法调用的事务也就无效了。
相关文章推荐
- Spring aop 通过获取代理对象实现事务切换
- spring aop 通过获取代理对象实现事务切换
- Spring aop事务代理对象通过TransactionInterceptor处理目标方法事务过程,cglib方式
- Spring进阶之路(10)-Advice简介以及通过cglib生成AOP代理对象
- Spring(十)通过动态代理(JDK的Proxy)和cglib实现AOP技术
- Spring AOP demo 和获取被CGLIB代理的对象
- [转载]aop代理方式引起的spring注入bean(实现类)与获取bean(实现类)出错
- 通过SpringAOP+注解实现自动代理
- Spring3.1.0实现原理分析(十).AOP代理对象执行拦截过程
- Spring AOP demo 和获取被CGLIB代理的对象
- Spring3.1.0实现原理分析(九).AOP之创建代理对象的过程
- Spring AOP的实现之建立AopProxy代理对象
- Spring AOP高级——源码实现(3)AopProxy代理对象之JDK动态代理的创建过程
- Spring3.1.0实现原理分析(九).AOP创建代理对象的过程
- 黑马程序员--09.动态与代理AOP--06【动态代理实例化的过程升级--目标对象+系统功能的参数化】【实现类似Spring的可配置AOP框架】
- mybatis+spring中的Mapper通过非自动注入方式获取Mapper代理对象(Spring 工厂)
- JAVAEE之Spring学习(三)---通过aop切面实现事务处理
- 【Spring源码--AOP的实现】(一)AopProxy代理对象的创建
- Spring进阶之路(9)-Spring AOP面向切面编程概念以及通过JDK代理生成AOP代理对象