避免在Spring中从父上下文中覆盖子上下文bean

时间:2015-09-11 23:31:02

标签: xml spring

我的应用程序中有以下两个xml文件。使用parent.xml初始化应用程序上下文,稍后使用代码:

使用child.xml更新
context = FileSystemXmlApplicationContext(parentContext)
context.setConfigLocations(child xml path)
context.refresh()

parent.xml:
<bean id="cache" class="com.ICache"/>

child.xml:
<bean id="bean1" class="com.Class1">
   <constructor-arg index="0" ref="cache"/>
</bean>

<bean id="bean2" class="com.Class2">
   <constructor-arg index="0" ref="bean1"/>
</bean>

<bean id="bean3" class="com.Class3">
   <constructor-arg index="0" ref="cache"/>
</bean>

<bean id="bean4" class="com.Class4">
   <constructor-arg index="0" ref="bean3"/>
</bean>

我现在有一个用例,要求我在child.xml中初始化的一些bean中交换“cache”bean,这就是我所做的: 将以下配置添加到parent.xml:

<bean id="newCache" class="com.ICache"/>
<bean id="bean3" class="com.Class3">
   <constructor-arg index="0" ref="newCache"/>
</bean>

然而,这似乎不起作用,我想它是因为bean初始化的顺序,当有多个具有相同名称的bean时,最后一个获胜。有没有办法不让父bean被子上下文中的父bean覆盖?

另外,有没有办法在spring配置中添加条件逻辑(例如:if bean定义)?我想知道我是否可以修改child.xml中的某些bean以使用“newCache”,如果已定义,则使用“cache”。

感谢。

1 个答案:

答案 0 :(得分:1)

我的建议是在Class3中为缓存提供一个setter:

public class Class3 {
  private ICache cache;
  public Class3(ICache cache){..}
  public setICache(ICache cache) {
      this.cache = cache;
  }

}

如果要在ClassA中交换Class3的缓存(ClassA是Class3的客户端),请实现ApplicationContextAware并更改Class3的缓存:

public class ClassA implements ApplicationContextAware {

 @Autowire
 Class3 class3;

 @Override
  public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
    ICache cache = (ICache)applicationContext.getBean("newCache");
    class3.setICache(cache);
  }

}

我希望我能理解你正在寻找的东西。否则评论答案,讨论它。