Spring Aop 动态代理失效分析
1. Spring Aop 原理
Spring Aop 通过动态代理创建代理对象,在调用代理对象方法前后做增强。
2. Transactional
, Async
注解失效?
当在动态代理方法中调用当前实例的 Transactional
或 Async
标记的方法时,注解不会生效;
原因:在此条件下调用注解标记的方法相当于调用实例本身的方法 this.func()
,此时不会通过 Spring Aop 的增强,所以注解不生效
3. 注解失效的处理方式
- 配置
<aop:aspectj-autoproxy expose-proxy="true" />
暴露代理对象,Spring Boot 中可使用@EnableAspectJAutoProxy(exposeProxy=true)
注解 - 将方法中的
this.func()
调用修改为以下形式
// 从AppContext中获取当前代理对象(ThreadLocal)
Object proxy = AppContext.currentProxy;
// 调用代理方法
proxy.func();