返回顶部
首页 > 资讯 > 精选 >Spring aop怎么通过获取代理对象实现事务切换
  • 431
分享到

Spring aop怎么通过获取代理对象实现事务切换

2023-06-20 16:06:50 431人浏览 泡泡鱼
摘要

这篇文章主要介绍“spring aop怎么通过获取代理对象实现事务切换”,在日常操作中,相信很多人在Spring aop怎么通过获取代理对象实现事务切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Sprin

这篇文章主要介绍“spring aop怎么通过获取代理对象实现事务切换”,在日常操作中,相信很多人在Spring aop怎么通过获取代理对象实现事务切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Spring aop怎么通过获取代理对象实现事务切换”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

Spring aop 获取代理对象实现事务切换

项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关,

这里面涉及到一个事务切换的问题,一般的方法没问题,根据通过aop注解在方法上通过加注解标识,

答案是:

通过spring aop类里面的AopContext类获取当前类的代理对象,

这样就能切换对应的事务管理器了,具体做法如下:

(1).在applicationContext.xml文件中配置如下:

<!-- 开启暴露Aop代理到ThreadLocal支持  -->      <aop:aspectj-autoproxy expose-proxy="true"/>

(2).在需要切换的地方获取代理对象,

再调用对应的方法,如下:

((类名) AopContext.currentProxy()).方法();

(3).注意

这里需要被代理对象使用的方法必须是public类型的方法,不然获取不到代理对象,会报下面的错误:

java.lang.IllegalStateException: Cannot find current proxy: Set 'exposeProxy' property on Advised to 'true' to make it available.

开启暴露AOP代理即可.

因为开启事务和事务回滚,实际这个过程是aop代理帮忙完成的,当调用一个方法时,它会先检查时候有事务,有则开启事务,

当调用本类的方法是,它并没有将其视为proxy调用,而是方法的直接调用,所以也就没有检查该方法是否含有事务这个过程,

那么本地方法调用的事务也就无效了。

获取代理bean的原始对象

public class AopTargetUtil {      public static Object getTarget(Object proxy) throws Exception {      if(!AopUtils.isAopProxy(proxy)) {         return proxy;//不是代理对象      }      if(AopUtils.isjdkDynamicProxy(proxy)) {         return getJdkDynamicProxyTargetObject(proxy);      } else { //cglib         return getCglibProxyTargetObject(proxy);      }   }   private static Object getCglibProxyTargetObject(Object proxy) throws Exception {      Field h = proxy.getClass().getDeclaredField("CGLIB$CALLBACK_0");      h.setAccessible(true);      Object dynamicAdvisedInterceptor = h.get(proxy);      Field advised = dynamicAdvisedInterceptor.getClass().getDeclaredField("advised");      advised.setAccessible(true);      Object target = ((AdvisedSupport)advised.get(dynamicAdvisedInterceptor)).getTargetSource().getTarget();      return target;   }   private static Object getJdkDynamicProxyTargetObject(Object proxy) throws Exception {      Field h = proxy.getClass().getSuperclass().getDeclaredField("h");      h.setAccessible(true);      AopProxy aopProxy = (AopProxy) h.get(proxy);      Field advised = aopProxy.getClass().getDeclaredField("advised");      advised.setAccessible(true);      Object target = ((AdvisedSupport)advised.get(aopProxy)).getTargetSource().getTarget();      return target;   }}

到此,关于“Spring aop怎么通过获取代理对象实现事务切换”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Spring aop怎么通过获取代理对象实现事务切换

本文链接: https://lsjlt.com/news/298426.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Spring aop怎么通过获取代理对象实现事务切换
    这篇文章主要介绍“Spring aop怎么通过获取代理对象实现事务切换”,在日常操作中,相信很多人在Spring aop怎么通过获取代理对象实现事务切换问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Sprin...
    99+
    2023-06-20
  • Spring aop 如何通过获取代理对象实现事务切换
    Spring aop 获取代理对象实现事务切换 在项目中,涉及到同一个类中一个方法调用另外一个方法,并且两个方法的事务不相关, 这里面涉及到一个事务切换的问题,一般的方法没问题,根据...
    99+
    2024-04-02
  • Spring代理对象导致的获取不到原生对象注解怎么解决
    本文小编为大家详细介绍“Spring代理对象导致的获取不到原生对象注解怎么解决”,内容详细,步骤清晰,细节处理妥当,希望这篇“Spring代理对象导致的获取不到原生对象注解怎么解决”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来...
    99+
    2023-06-29
  • spring boot怎么整合quartz实现通过页面操作管理定时任务
    这篇文章主要介绍“spring boot怎么整合quartz实现通过页面操作管理定时任务”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“spring boot怎么整合...
    99+
    2024-04-02
  • 怎么通过Java实现反向代理集群服务的平滑分配
    本文小编为大家详细介绍“怎么通过Java实现反向代理集群服务的平滑分配”,内容详细,步骤清晰,细节处理妥当,希望这篇“怎么通过Java实现反向代理集群服务的平滑分配”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。1...
    99+
    2023-06-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作