Spring AOP 创建额外的 bean

发布于 2024-12-13 06:23:49 字数 666 浏览 1 评论 0原文

我正在玩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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

无远思近则忧 2024-12-20 06:23:49

虽然我不确定,但我的猜测是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

亢潮 2024-12-20 06:23:49

当 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文