欢迎来到淼淼之森的个人小站。  交流请加我微信好友: studyjava。  也欢迎关注同名公众号:Java学习之道

@EnableAspectJAutoProxy注解中的参数proxyTargetClass = true和exposeProxy=true有什么区别? 置顶!

  |   0 评论   |   0 浏览

@EnableAspectJAutoProxy 注解有两个重要的参数:proxyTargetClassexposeProxy。它们的作用和区别如下:

  • proxyTargetClass = true

    • 启用CGLIB代理方式。
    • 默认情况下,Spring AOP 使用JDK动态代理(基于接口)。如果目标类没有实现任何接口,或者需要代理类本身的方法调用,可以使用CGLIB代理。
    • CGLIB代理通过继承目标类来创建代理对象,适用于没有接口的情况。
  • exposeProxy = true

    • 将代理对象暴露给当前线程的 ThreadLocal
    • 这样可以在切面中通过 AopContext.currentProxy() 方法访问到当前的代理对象。
    • 主要用于解决自调用问题,即在一个类的方法内部调用另一个被代理的方法时,能够确保调用的是代理方法而不是原始方法。

代码示例

@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
public class Application {
    // 应用程序的主类
}

控制流图

由于这段代码非常简单,没有复杂的逻辑,因此控制流图也非常简单。以下是Mermaid代码:

flowchart TD
    A[启动应用] -->|启用AspectJ自动代理| B[使用CGLIB代理]
    B -->|暴露代理对象| C[代理对象可访问]

解释

  • [启动应用]:应用程序启动时,Application 类被加载。
  • [使用CGLIB代理]:通过 @EnableAspectJAutoProxy(proxyTargetClass = true) 注解,启用了AspectJ自动代理,并指定了使用CGLIB代理方式。
  • [代理对象可访问]:通过 exposeProxy = true,将代理对象暴露给当前线程的 ThreadLocal,使得在切面中可以通过 AopContext.currentProxy() 访问代理对象。

总结

  • proxyTargetClass = true:选择CGLIB代理方式。
  • exposeProxy = true:将代理对象暴露给当前线程,以便在切面中访问。

标题: @EnableAspectJAutoProxy注解中的参数proxyTargetClass = true和exposeProxy=true有什么区别?
作者:jerrycookie
地址:https://www.mmzsblog.cn/articles/2024/11/07/1730965021907.html

如未加特殊说明,文章均为原创,转载必须注明出处。均采用CC BY-SA 4.0 协议

本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。
• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!

个人微信公众号 ↓↓↓                 

微信搜一搜 Java 学习之道