加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 23:15:20 所属栏目:百科 来源:网络整理
导读:我有一个关于组件扫描的问题,以及在 Spring版本3.0.5.RELEASE中为同一服务类的XML配置中使用额外的bean定义. 我创建了一个带有注释的“MyService”类 @Service( "myService" ) 并且对于同一个类,有一个bean定义,如下所示: bean id="myService" class="....M
我有一个关于组件扫描的问题,以及在 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”,该类只会被实例化一次.

我的两个问题是:

>虽然这是我目前想要的行为,是否可以将XML bean定义和组件扫描混合到一个类中,以使用不同的Bean ID实例化两次?
>有谁知道,Spring的“幕后”机制是什么? Spring如何决定何时只实例化一次类? (也许不允许在同一个类中混合组件扫描和XML bean定义?)

非常感谢你的帮助!

解决方法

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

作为注释:

@Scope(StandardScopes.PROTOTYPE)

在xml中:

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

如果你只需要一个bean的两个实例,最好的方法是用XML认为其中两个是dfiferent名称.

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

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读