Spring AOP 生成的代理类的位置

Posted

技术标签:

【中文标题】Spring AOP 生成的代理类的位置【英文标题】:Location of the proxy class generated by Spring AOP 【发布时间】:2012-07-17 10:11:32 【问题描述】:

只是为了学习和理解代理,我想看看Spring AOP生成的代理类。它不存在于 Eclipse 生成的类文件夹中。

谁能告诉我它的位置?

【问题讨论】:

【参考方案1】:

如果您使用基于接口的代理(默认),Spring 使用Proxy 类在内存中动态创建代理。没有与该类关联的 .class 文件。

当使用基于类的代理时(通过cglib),Spring 会为您的类创建具体的子类。在调试器中,您会注意到它们的名称类似于 YourRealService$$EnhancerByCGLIB$$... 但同样,这些类仅在内存中生成,而不是存储在磁盘上。

如果你真的想深入了解 AOP,你将不得不使用aspectj 和编译时编织。工作量太大了。所以底线是:相信他们的工作。如果他们不这样做:检查堆栈跟踪。

【讨论】:

非常感谢 Tomasz 的精彩解释。我相信他们会工作 :) 我心中仍有一个问题。为什么很多人说在使用AOP时我们应该考虑内存限制,因为AOP会创建子类。它是否正确?即使 AOP 创建类,它也只使用代理类而不是我们创建的类。 @KhalidAnsari:很多动态生成的类(我认为这不适用于通过Proxy 创建的动态代理)将占用 PermGen 空间(而不是堆)。我从来没有遇到过任何问题,但请记住这一点。 怎么可能看到它们呢?我正在开发一个需要扩展 YourRealService$$EnhancerByCGLIB$$ 类的库,但我似乎找不到它们

以上是关于Spring AOP 生成的代理类的位置的主要内容,如果未能解决你的问题,请参考以下文章

java----代理机制或动态类的生成

Spring框架系列(10) - Spring AOP实现原理详解之AOP代理的创建

Spring框架的AOP实现(JDK+CGLIB)

基于代理类的AOP的实现

Spring AOP

spring中AOP