zoukankan      html  css  js  c++  java
  • 使用AopContxt.currentProxy()方法获取当前代理对象

    常规使用Spring的AOP功能,都是对一个Service中的B方法进行切入记录日志,这些时候AOP是能起作用的。但是假如B方法被service中的A方法调用,在B方法上的切入便会失效,导致无法记录日志。

    要弄清楚切入失败的原因,就要先了解切入的原理。为什么能够切入目标对象,原理就是创建了代理类,在代理类中在调用目标方法的前后进行切入。比如说目标对象是service,代理对象是$proxy0,这时候切入对B方法的调用就是$proxy0.B(),执行流程就是先记录日志再调用目标对象service的B方法,所以可以切入;但是A方法$proxy0.A(),只能对A方法增强,A里面调B的时候使用的是service目标对象s.B(),而不是$proxy0.B(),所以对B的切入无效,因为压根就没用代理对象去调用。

    解决方案就是把service目标对象的A方法中对B的调用改成代理对象的调用,怎么获取代理对象呢,AopContext.currentProxy()使用ThreadLocal保存了代理对象,因此在A方法中使用【((Service) AopContext.currentProxy()).B()】就能解决切入失效的问题。

    另外,如果使用【AopContxt.currentProxy()】方法获取当前代理对象需要在类上添加【@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)】注解。

    "不在一起就不在一起吧,反正一辈子也没多长。"

  • 相关阅读:
    -_-#【缓存】Content-Type 错误
    ♫【事件】事件处理程序
    -_-#【Node】Express 400 Error: ENOENT, open
    【JS】定位
    【JS】壹零零壹
    洛谷—— P1018 乘积最大
    洛谷—— P1017 进制转换
    洛谷——P1011 车站
    洛谷——P2241 统计方形(数据加强版)
    洛谷——P1548 棋盘问题
  • 原文地址:https://www.cnblogs.com/yanggb/p/13227309.html
Copyright © 2011-2022 走看看