我的应用程序中有以下两个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”。
感谢。
答案 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);
}
}
我希望我能理解你正在寻找的东西。否则评论答案,讨论它。