如何将豆类从一个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
为什么你需要两个单独的上下文?他们是否需要独立刷新?有没有交叉依赖关系?对不起,我向你投掷了很多问题,但是我没有看到这里的大局,没有它我不能拿出任何有用的东西。 – mrembisz 2012-03-27 07:57:57
@mrembisz是的,他们需要独立刷新。第一个上下文在启动时填充,通常包含一些基础结构bean。当我在正在运行的进程上部署'application pkg'时,将动态创建第二个上下文。该包中包含了需要动态加载的bean定义。并可以稍后卸载/升级。所以从某种意义上说,第一个应用上下文就是平台,第二个上下文包含应用程序,它可以被热部署,取消部署。 – weima 2012-03-27 09:21:26
从这个描述我会有一个启动时建立一次的“平台”上下文。它将是“动态”上下文的父代,可在需要时刷新或重新创建。这假定您只需刷新“动态”上下文。如果你不得不刷新“平台”的上下文,它会导致我想两个刷新。在这里我没有看到需要切换父上下文。 – mrembisz 2012-03-27 09:30:50