首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring AOP创建额外的bean

Spring AOP创建额外的bean
EN

Stack Overflow用户
提问于 2011-11-01 22:48:07
回答 2查看 898关注 0票数 5

我在玩Spring AOP。

下面是一个简单的类

代码语言:javascript
复制
public class CModel extends Car {
    private double torqueMeasure = 1;

    public CModel() {
        System.out.println(" C-Model constructor");        
    }
}

Spring的配置是这样的

代码语言:javascript
复制
<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对象。

你知道为什么会是这样吗?

谢谢。

EN

回答 2

Stack Overflow用户

发布于 2011-11-01 22:57:43

虽然我不确定,但我猜测spring首先实例化常规类,然后创建一个CGLIB代理,这是一个子类。请注意,对于初始化,您应该使用@PostConstruct,它保证只使用一次。

为了验证我的假设,在构造函数中添加一个断点,并查看它何时被调用-其中一次应该是在CModel$EnhancedByCGLIB之后

票数 5
EN

Stack Overflow用户

发布于 2011-11-01 23:08:08

当Spring为您的类创建一个代理时,它将使用CGLIB来生成一个子类CModel的类。净影响是你的构造函数将被调用两次。

查看Spring文档,了解更多细节(特别是第三个要点):http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying

顺便说一下,如果您的类实现了一个接口,Spring将使用JDK代理机制-- JDK代理机制不会调用您的构造函数。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7968248

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档