2012-08-06 154 views
8

假设我有两个模块。一个是核心,另一个是核心依赖实现模块。核心是该依赖实现模块战争的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定义。在Bean定义上有任何priority种类的属性让ApplicationContext在找到具有相同ID的Bean时使用最低优先级的一个优先级。重写bean定义的

回答

12

的一种方法是,你已表示什么 - 用相同的ID定义它多次,并用相同的ID中的最后bean定义就是其中之一生效。因此,如果你确保ExtX是最后一个加载的,它应该可以工作,并且为了确保这一点,你可以在war文件中这样做,而不是通过说classpath:springfolder来加载,你可以明确地将核心配置导入到你的战争的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定义,并通过预期订单属性并使用它这样,但是还有很多工作要做。

第二种方法是这里介绍:Overriding the bean defined in parent context in a child context

+0

会尽办法 – Pokuri 2012-08-07 03:18:03

+0

当然它的作品。但是用另一个定义来定义一个定义是一个好习惯吗?我认为这是一种破解:/ – 2013-10-24 13:19:24