【问题标题】:overriding bean configuration in spring在spring中覆盖bean配置
【发布时间】: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


    【解决方案1】:

    覆盖bean定义的一种方法是您所指出的 - 使用相同的ID多次定义它,并且具有相同ID的最后一个bean定义是生效的。因此,如果您确保 ExtX 是最后一个加载的,它应该可以正常工作,并且为了确保这一点,您可以在您的 war 文件中执行此操作,而不是通过说 classpath:springfolder 加载,您可以显式导入核心配置在你的战争的 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&lt;String,X&gt; 作为参数来加载一个类型的所有 bean 定义,并通过期望 order 属性对其进行排序和以这种方式使用它,但还有很多工作要做。

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

    【讨论】:

    • 当然可以。但是,将一个定义覆盖另一个定义是一种好习惯吗?我认为这是一种黑客行为:/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-07
    相关资源
    最近更新 更多