如何解决基于动态代理的AOP注解在内部调用中失效的问题?

2026-05-28 00:411阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计250个文字,预计阅读时间需要1分钟。

如何解决基于动态代理的AOP注解在内部调用中失效的问题?

一、背景+使用AOP动态代理增强系统一种修改方法,但因为是使用proxy对象调用invoke方法后,方法再内部调用时是用this原对象来调用方法的,故无法进行代理。

一、背景

使用AOP动态代理增强统一修改方法,但是由于​​proxy​​​对象调用​​invoke​​​方法后,方法再内部自调用时是用的​​this​​原对象来调用方法,故无法进行代理

如何解决基于动态代理的AOP注解在内部调用中失效的问题?

二、解决方法

  • 使用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参考​​

    本文共计250个文字,预计阅读时间需要1分钟。

    如何解决基于动态代理的AOP注解在内部调用中失效的问题?

    一、背景+使用AOP动态代理增强系统一种修改方法,但因为是使用proxy对象调用invoke方法后,方法再内部调用时是用this原对象来调用方法的,故无法进行代理。

    一、背景

    使用AOP动态代理增强统一修改方法,但是由于​​proxy​​​对象调用​​invoke​​​方法后,方法再内部自调用时是用的​​this​​原对象来调用方法,故无法进行代理

    如何解决基于动态代理的AOP注解在内部调用中失效的问题?

    二、解决方法

  • 使用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参考​​