【发布时间】:2013-10-07 13:26:09
【问题描述】:
假设我有两个模块。一个是核心,另一个是核心依赖的实现模块。 Core 是那个依赖实现模块 war 的 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>
我们正在使用web.xml 中的contextConfigLocation 上下文参数构建应用程序上下文,将值指定为classpath:springfolder。
但在核心逻辑中,我只获取核心 bean 实例(即 X 实例)而不是 ExtX。我们如何覆盖该 bean 定义并让系统开始使用新的扩展 bean 定义?
而且我听说在不同的应用程序上下文文件中使用相同的 ID 会用稍后加载的 bean 定义覆盖第一个加载的 bean 定义。 bean 定义中是否有任何priority 类型的属性,以便在找到具有相同 ID 的 bean 时,让 ApplicationContext 使用最高优先级的一个来考虑低优先级的一个。
【问题讨论】:
标签: spring inversion-of-control