一、背景
使用AOP动态代理增强统一修改方法,但是由于proxy
对象调用invoke
方法后,方法再内部自调用时是用的this
原对象来调用方法,故无法进行代理
二、解决方法
- 使用ApplicationContext.getBean()获取代理对象调用
- 加上注解
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
,然后使用AopContext.currentProxy()
方法 -
@Autowired
注入自己 - 参考
lombok
使用字节码技术
- 自定义注解
@AopInnerSupport
- 继承
AbstractProcessor
类,处理携带@AopInnerSupport
的类 - 在方法前面按方法3注入
proxy
代理对象 - 不停递归
JCExpression
、JCStatement
找到满足条件的方法 - 找到所有带有@Transactional的方法
- 然后修改调用了@Transactional的语句this.method()和super.method()成proxy.method(),需要忽略构造方法
AST参考