10

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

在核心中,我定义了一个 bean,例如

<bean id="x" class="com.pokuri.X">
 <property name="y" ref="y"/>
 <property name="z" ref="z"/>
</bean>

该类有一个方法如下

public class X{

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

}

这个方法是从一些核心类中调用的。现在我需要根据我的核心相关实现来更改 X 的 doSomeJob() 方法中的逻辑。所以,我创建了一个这样的类

public class ExtX extends X{

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

}

并像这样在另一个应用程序上下文 xml 文件中定义了具有相同 id 的 bean。

<bean id="x" class="com.pokuri.ExtX">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
</bean>

我们正在使用contextConfigLocation上下文参数web.xml将值指定为来构建应用程序上下文classpath:springfolder

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

而且我听说在不同的应用程序上下文文件中具有相同的 ID 将用稍后加载的 bean 定义覆盖第一次加载的 bean 定义。当找到具有相同 ID 的 bean 时,是否有任何priority关于 bean 定义的属性让 ApplicationContext 使用最高优先级的优先级来考虑低优先级的优先级。

4

1 回答 1

14

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

<import resource="core-resource.xml"/>
<bean id="x" class="com.pokuri.ExtX">
     <property name="y" ref="y"/>
     <property name="z" ref="z"/>
</bean>

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

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

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

于 2012-08-06T18:55:28.987 回答