Pok*_*uri 9 spring inversion-of-control
假设我有两个模块.一个是核心,另一个是核心相关实现模块.Core是该依赖实现模块之战的jar文件.
在核心我有一个定义的bean
<bean id="x" class="com.pokuri.X">
<property name="y" ref="y"/>
<property name="z" ref="z"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
那个类的方法如下
public class X{
public void doSomeJob(){
.......
}
}
Run Code Online (Sandbox Code Playgroud)
从一些核心类调用此方法.现在我需要根据我的核心依赖实现来改变X的doSomeJob()方法中的逻辑.所以,我创建了一个这样的类
public class ExtX extends X{
@override
public void doSomeJob(){
// changed logic
}
}
Run Code Online (Sandbox Code Playgroud)
并在另一个应用程序上下文xml文件中定义了具有相同id的bean.
<bean id="x" class="com.pokuri.ExtX">
<property name="y" ref="y"/>
<property name="z" ref="z"/>
</bean>
Run Code Online (Sandbox Code Playgroud)
我们正在使用contextConfigLocation上下文参数构建应用程序上下文,web.xml将值指定为classpath:springfolder.
但在核心逻辑中,我只获得了核心bean实例(即X实例)ExtX.我们如何覆盖该bean定义并让系统开始使用新的扩展bean定义?
我听说在不同的应用程序上下文文件中使用相同的ID将覆盖第一个加载的bean定义以及后来加载的bean定义.priority当找到具有相同ID的bean时,是否有任何类型的bean定义属性让ApplicationContext使用最高优先级的属性来考虑低优先级的属性.
Bij*_*men 13
覆盖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>
Run Code Online (Sandbox Code Playgroud)
这将确保您重写的bean是生效的bean.
这里没有可以使用的优先级/订单字段 - 如果您希望通过提供Map<String,X>参数来加载类型的所有bean定义,并通过期望订单属性对其进行排序并以此方式使用,但是还有很多工作要做.
这里描述了第二种方法:覆盖子上下文中父上下文中定义的bean
| 归档时间: |
|
| 查看次数: |
39307 次 |
| 最近记录: |