@EnableAspectJAutoProxy注解中的参数proxyTargetClass = true和exposeProxy=true有什么区别? 置顶!
@EnableAspectJAutoProxy
注解有两个重要的参数:proxyTargetClass
和 exposeProxy
。它们的作用和区别如下:
-
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 协议!
本网站发布的内容(图片、视频和文字)以原创、转载和分享网络内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。若本站转载文章遗漏了原文链接,请及时告知,我们将做删除处理!文章观点不代表本网站立场,如需处理请联系首页客服。• 网站转载须在文章起始位置标注作者及原文连接,否则保留追究法律责任的权利。
• 公众号转载请联系网站首页的微信号申请白名单!