首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重写spring中的bean配置

重写spring中的bean配置
EN

Stack Overflow用户
提问于 2012-08-07 02:25:58
回答 1查看 44.3K关注 0票数 10

假设我有两个模块。一个是核心,另一个是依赖于核心的实现模块。Core是一个jar文件,用于依赖的实现模块war。

在核心中,我有一个定义如下的bean

代码语言:javascript
复制
<bean id="x" class="com.pokuri.X">
 <property name="y" ref="y"/>
 <property name="z" ref="z"/>
</bean>

这个类的方法如下所示

代码语言:javascript
复制
public class X{

  public void doSomeJob(){
   .......
  }   

}

这个方法是从一些核心类中调用的。现在,我需要根据我的核心依赖实现修改X的doSomeJob()方法中的逻辑。因此,我创建了一个如下所示的类

代码语言:javascript
复制
public class ExtX extends X{

  @override
  public void doSomeJob(){
    // changed logic
  }

}

并在另一个应用程序上下文xml文件中定义具有相同id的bean,如下所示。

代码语言:javascript
复制
<bean id="x" class="com.pokuri.ExtX">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
</bean>

我们使用web.xml中的contextConfigLocation上下文参数构建应用程序上下文,并将值指定为classpath:springfolder

但在核心逻辑中,我只获得核心bean实例(即X实例),而不是ExtX。如何覆盖bean定义并让系统开始使用新扩展bean定义?

我听说在不同的应用程序上下文文件中具有相同ID的文件将用后来加载的bean定义覆盖第一个加载的bean定义。当发现具有相同ID的bean时,在bean定义上是否有任何priority类型的属性让ApplicationContext使用最高优先级的bean而不是低优先级的bean。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-08-07 02:55:29

覆盖bean定义的一种方法正如您所指出的那样-使用相同的id多次定义它,最后一个具有相同id的bean定义生效。因此,如果您确保ExtX是最后一个加载的bean,它应该可以正常工作,为了确保这一点,您可以在war文件中执行此操作,而不是通过指定classpath:springfolder来加载,您可以显式地在war的Spring config文件中导入核心配置,然后以这种方式覆盖bean:

代码语言:javascript
复制
<import resource="core-resource.xml"/>
<bean id="x" class="com.pokuri.ExtX">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
</bean>

这将确保被覆盖的bean是生效的bean。

但是这里没有可以使用的优先级/顺序字段-如果您愿意,可以通过提供Map<String,X>作为参数来加载类型的所有bean定义,并根据期望的order属性对其进行排序并以这种方式使用它,但它需要做更多的工作。

这里描述了第二种方法:Overriding the bean defined in parent context in a child context

票数 14
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11833804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档