假设我有两个模块。一个是核心,另一个是依赖于核心的实现模块。Core是一个jar文件,用于依赖的实现模块war。
在核心中,我有一个定义如下的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>我们使用web.xml中的contextConfigLocation上下文参数构建应用程序上下文,并将值指定为classpath:springfolder。
但在核心逻辑中,我只获得核心bean实例(即X实例),而不是ExtX。如何覆盖bean定义并让系统开始使用新扩展bean定义?
我听说在不同的应用程序上下文文件中具有相同ID的文件将用后来加载的bean定义覆盖第一个加载的bean定义。当发现具有相同ID的bean时,在bean定义上是否有任何priority类型的属性让ApplicationContext使用最高优先级的bean而不是低优先级的bean。
发布于 2012-08-07 02:55:29
覆盖bean定义的一种方法正如您所指出的那样-使用相同的id多次定义它,最后一个具有相同id的bean定义生效。因此,如果您确保ExtX是最后一个加载的bean,它应该可以正常工作,为了确保这一点,您可以在war文件中执行此操作,而不是通过指定classpath:springfolder来加载,您可以显式地在war的Spring config文件中导入核心配置,然后以这种方式覆盖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是生效的bean。
但是这里没有可以使用的优先级/顺序字段-如果您愿意,可以通过提供Map<String,X>作为参数来加载类型的所有bean定义,并根据期望的order属性对其进行排序并以这种方式使用它,但它需要做更多的工作。
这里描述了第二种方法:Overriding the bean defined in parent context in a child context
https://stackoverflow.com/questions/11833804
复制相似问题