Spring AOP创建了额外的bean

时间:2011-11-01 14:48:07

标签: java spring aop spring-aop

我正在玩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对象。

知道为什么会这样吗?

感谢。

2 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:3)

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

查看Spring文档以获取更多详细信息(特别是第三个项目符号): http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying

作为旁注,如果您的类实现了一个接口,Spring将使用JDK代理机制 - 而JDK代理机制将不会调用您的构造函数。