使用AopContxt.currentProxy()方法获取当前类的代理对象

2022-06-26 14:35:27

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


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


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


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

exposeProxy:在AopContext中暴露代理对象。指示代理应由 AOP 框架公开为ThreadLocal以通过AopContext类进行检索。 默认关闭,即不保证可访问的AopContext。

  • 作者:Abstracted
  • 原文链接:https://blog.csdn.net/qq_16159433/article/details/120952972
    更新时间:2022-06-26 14:35:27