2012-03-27 71 views
2

如何将豆类从一个ClassPathXMLApplicationContext转移到另一个?java:Spring:如何将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 

是有可能从my2ndContext所有豆类转移到myOneContext

我已经从myOneContext越来越Bean工厂并获取其内部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()); 

这种方式,所有从两个方面豆类在myOneContext

可见,但是当我有破坏my2ndContext和我设置了Bean工厂的母公司为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; 
} 

我应该选择哪种方式?转移豆子或建立父母关系。哪个更好?

感谢,

问候,

VIMAL

+0

为什么你需要两个单独的上下文?他们是否需要独立刷新?有没有交叉依赖关系?对不起,我向你投掷了很多问题,但是我没有看到这里的大局,没有它我不能拿出任何有用的东西。 – mrembisz 2012-03-27 07:57:57

+0

@mrembisz是的,他们需要独立刷新。第一个上下文在启动时填充,通常包含一些基础结构bean。当我在正在运行的进程上部署'application pkg'时,将动态创建第二个上下文。该包中包含了需要动态加载的bean定义。并可以稍后卸载/升级。所以从某种意义上说,第一个应用上下文就是平台,第二个上下文包含应用程序,它可以被热部署,取消部署。 – weima 2012-03-27 09:21:26

+0

从这个描述我会有一个启动时建立一次的“平台”上下文。它将是“动态”上下文的父代,可在需要时刷新或重新创建。这假定您只需刷新“动态”上下文。如果你不得不刷新“平台”的上下文,它会导致我想两个刷新。在这里我没有看到需要切换父上下文。 – mrembisz 2012-03-27 09:30:50

回答

3

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

最好保持父子层次平坦 - 一个父上下文和多个子上下文。兄弟姐妹应用程序上下文之间的交叉依赖首先会诱发混沌,并且支持这种依赖需要一些不平凡的黑客或变通方法。

如果这种兄弟姐妹依赖是必须的,那么看看OSGI。

+0

非常感谢:) – weima 2012-03-27 19:36:14

相关问题