gpt4 book ai didi

Spring 在同一类中混合组件扫描和 XML bean 定义时的行为?

转载 作者:行者123 更新时间:2023-12-02 15:18:34 25 4
gpt4 key购买 nike

我有一个关于组件扫描以及在 Spring 版本 3.0.5.RELEASE 中同一服务类的 XML 配置中使用附加 bean 定义的问题。

我创建了一个带有注释的类“MyService”

@Service( "myService" )

同一个类有一个 bean 定义,如下所示:

<bean id="myService" class="....MyService" />

我放了

System.out.println( "MyService has been instantiated" );

将消息传递到 MyService 类的构造函数中。当我的应用程序启动时,该消息将在控制台仅显示一次。 Spring 似乎足够聪明,可以检测到该类只能有一个 id 为“myService”的实例。

但即使我将注释更改为

@Service( "myService2" )

并将 xml bean 定义 id 保留为“myService”,该类只会实例化一次。

我的两个问题是:

  1. 虽然这是我当前想要的行为,但是是否可以将 XML bean 定义和组件扫描混合到一个类中,并使用不同的 Bean ID 实例化两次?

  2. 有谁知道Spring“幕后”的机制是什么? Spring 如何决定何时只实例化一个类一次? (也许只是不允许在同一个类中混合使用组件扫描和 XML bean 定义?)

非常感谢您的帮助!

最佳答案

您的问题2.很容易回答。 Spring 根据 bean 的范围来实例化 bean。无论您使用 xml 还是基于注释的配置,默认范围都是“singleton”。如果将 bean 声明为scope=prototype,则每次向容器请求该 bean 时都会实例化该 bean。

作为注释:

@Scope(StandardScopes.PROTOTYPE)

在 XML 中:

<bean .... scope="prototype">

如果您需要一个 bean 的两个实例,我认为最好是在 XML 中使用不同的名称声明其中两个实例。

关于你的问题1,我不知道是否可以声明一个类的两个实例,一个使用注释,一个使用XML。您确定类路径扫描在您的示例中确实有效吗?忽略 XML bean 声明并重试,那么您是否有该 bean 的实例?如果没有,您应该首先修复类路径扫描,因为它似乎不起作用。

无论如何,最重要的问题是:你为什么要这样做?混合两种类型的配置将创建一些难以维护的代码。不要混合配置类型,只选择一种,或者告诉我们为什么您需要它。

关于Spring 在同一类中混合组件扫描和 XML bean 定义时的行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7358825/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com