java:Spring:如何将bean从一个ClassPathXMLApplicationContext转移到另一个?

时间:2012-03-27 07:48:27

标签: java spring inversion-of-control

如何将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

1 个答案:

答案 0 :(得分:3)

我建议在里面设置一个包含所有共享基础架构的专用父上下文。特定于应用程序的上下文将使用此作为其父级。可以刷新动态上下文,同时保持父级中的共享部分不变。

最好保持父子层次结构平坦 - 一个父上下文和多个子上下文。兄弟应用程序上下文之间的交叉依赖关系虽然最初很诱人,但后来会导致混乱并支持这种依赖关系,这需要一些非常重要的黑客攻击或解决方法。

如果必须使用这种兄弟依赖关系,请查看OSGI。