Spring AOP 创建额外的 bean
我正在玩Spring AOP。
这是一个简单的类
public class CModel extends Car {
private double torqueMeasure = 1;
public CModel() {
System.out.println(" C-Model constructor");
}
}
Spring 配置是这样的
<aop:config>
<aop:aspect ref="audit">
<aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/>
...
</aop:aspect>
</aop:config>
现在好了;当我添加 aop:config 并拦截 CModel 时,Spring 会调用 CModel 构造函数两次。这意味着 Spring 创建了 2 个 CModel 对象,对吗?
如果我删除 AOP 配置,那么 Spring 只会创建一个 CModel 对象。
知道为什么会这样吗?
谢谢。
I 'm playing with Spring AOP.
Here is a simple class
public class CModel extends Car {
private double torqueMeasure = 1;
public CModel() {
System.out.println(" C-Model constructor");
}
}
And Spring configuration is like this
<aop:config>
<aop:aspect ref="audit">
<aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/>
...
</aop:aspect>
</aop:config>
Ok now; when i add aop:config and intercepts CModel then Spring calls CModel constructor twice. It means Spring creates 2 CModel object, right ?
If I delete AOP config then Spring creates only one CModel object.
Any idea why it is like this ?
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
虽然我不确定,但我的猜测是spring首先实例化常规类,然后创建一个CGLIB代理,它是一个子类。请注意,对于初始化,您应该使用
@PostConstruct
,它保证被使用一次。为了验证我的假设,请在构造函数中添加一个断点,然后查看何时调用它 - 其中一次它应该位于 CModel$EnhancedByCGLIB 某些内容之后
Though I'm not sure, my guess is that spring first instantiates the regular class, and then makes a CGLIB proxy, which is a subclass. Note that for initialization you should use
@PostConstruct
, which is guaranteed to be used once.To verify my hypothesis, add a breakpoint in the constructor and see when it is invoked - one of the times it should be right after the
CModel$EnhancedByCGLIB
something当 Spring 创建您的类的代理时,它将使用 CGLIB 生成一个 CModel 子类的类。最终的影响是你的构造函数将被调用两次。
查看 Spring 文档以获取更多详细信息(特别是第三个项目符号):
http://static .springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying
作为旁注,如果您的类实现了接口,Spring 将使用 JDK 代理机制 - 和JDK代理机制不会调用你的构造函数。
When Spring creates a proxy to your class, it will use CGLIB to generate a class that subclasses CModel. The net affect is your constructor will be called twice.
Check out the Spring documentation for more detail (specifically the third bullet):
http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying
As a side note, Spring will use the JDK proxying mechanism if your class implements an interface -- and the JDK proxying mechanism will not call your constructor.