Spring AOP创建了额外的bean

Lur*_*rtz 5 java aop spring spring-aop

我正在玩Spring AOP.

这是一个简单的课程

public class CModel extends Car {
    private double torqueMeasure = 1;

    public CModel() {
        System.out.println(" C-Model constructor");        
    }
}
Run Code Online (Sandbox Code Playgroud)

Spring配置就是这样的

<aop:config>
    <aop:aspect ref="audit">
        <aop:before pointcut="execution(* com.test.main..*(..))" method="firstControl"/>
            ...
    </aop:aspect>
</aop:config>
Run Code Online (Sandbox Code Playgroud)

现在可以; 当我添加aop:config并拦截CModel然后Spring调用CModel构造函数两次.这意味着Spring创建了2个CModel对象,对吧?

如果我删除AOP配置,那么Spring只创建一个CModel对象.

知道为什么会这样吗?

谢谢.

Boz*_*zho 5

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

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

  • 它在[7.6代理机制]中有记录(http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-proxying) (3认同)