什么时候会用到 AopContext.currentProxy()
方法A 内调用Aop修饰的方法B 失效、方法A 内调用@Async修饰的方法C 失效
为什么会失效
Spring代理机制造成的。
简单的说,就是通过spring容器获取的类对象,很多情况下并不是原类,而是被spring修饰过了的代理类。
例如你执行 A类对象的方法
A.invoke()
,而spring对A类做了修饰:实际你运行的是spring修饰过的代理类proxyAbean.invoke()方法。
这样就会造成一个问题,如果你在invoke()中调用A类的其余方法invoke2(),此时invoke2()是直接调用的原类的 A.invoke2(),而不是代理类proxyAbean.invoke2(),spring对方法做的修饰增强(@Async、@Transational、AOP)全部不会实现。
在配置文件加入如下配置 或者 加上 @EnableAspectJAutoProxy(exposeProxy = true) 注解
<aop:aspectj-autoproxy expose-proxy="true"/>