如何将bean从一个ClassPathXMLApplicationContext
转移到另一个?
我创建了一个这样的上下文
ClassPathXMLApplicationContext myOneContext = new ClassPathXMLApplicationContext("path to my xml bean definitions"); // It loads 10 beans which probably refer each other
ClassPathXMLApplicationContext my2ndContext = new ClassPathXMLApplicationContext("path to my xml bean definitions"); // It loads 2 beans, which probably refer each other
是否可以将所有bean从my2ndContext
转移到myOneContext
?
我从myOneContext
获取beanFactory并将其内部bean工厂设为DefaultSingletonBeanRegistry
并调用registerSingleton
Object beanObject = my2ndContext.getBean("beanName");
DefaultSingletonBeanRegistry lbf =(DefaultSingletonBeanRegistry)myOneContext.getBeanFactory();
lbf.registerSingleton("beanName", beanObject);
这样可以吗?我觉得我正在做一种黑客攻击。也不确定我还缺少什么。
另一种选择是将bean保留在相同的上下文中,并在AppContexts及其bean工厂之间添加父关系。
myOneContext.setParent(my2ndContext);
DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory();
lbf.setParentBeanFactory(my2ndContext.getBeanFactory());
这样,来自两个上下文的所有bean都可以在myOneContext
但是当我必须销毁my2ndContext
并且我将BeanFactory的父级设置为null时,会出现问题。
DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory();
lbf.setParentBeanFactory(null); <<< throws exception
因为它不允许更改bean工厂。
From Spring Sourse: AbstractBeanFactory.java
public void setParentBeanFactory(BeanFactory parentBeanFactory) {
if (this.parentBeanFactory != null && this.parentBeanFactory != parentBeanFactory) {
throw new IllegalStateException("Already associated with parent BeanFactory: " + this.parentBeanFactory);
}
this.parentBeanFactory = parentBeanFactory;
}
我应该选择哪种方式?转移bean或建立父关系。哪个更好?
谢谢,
此致
VIMAL
答案 0 :(得分:3)
我建议在里面设置一个包含所有共享基础架构的专用父上下文。特定于应用程序的上下文将使用此作为其父级。可以刷新动态上下文,同时保持父级中的共享部分不变。
最好保持父子层次结构平坦 - 一个父上下文和多个子上下文。兄弟应用程序上下文之间的交叉依赖关系虽然最初很诱人,但后来会导致混乱并支持这种依赖关系,这需要一些非常重要的黑客攻击或解决方法。
如果必须使用这种兄弟依赖关系,请查看OSGI。