gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 05:52:41 26 4
gpt4 key购买 nike

如何从一个人转移 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 转移所有 bean ?至 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 或建立父关系。哪个更可取?

谢谢,

问候,

维马尔

最佳答案

我建议设置一个专用的父上下文,其中包含所有共享基础设施。特定于应用程序的上下文将使用这个作为它们的父级。可以刷新动态上下文,同时保留父级中的共享部分完整无缺。

最好保持父子层次结构平坦 - 一个父上下文和多个子上下文。兄弟应用程序上下文之间的交叉依赖虽然起初很诱人,但后来会导致困惑,支持这种依赖需要一些重要的技巧或解决方法。

如果这种兄弟依赖是必须的,请查看 OSGI。

关于java:Spring:如何将 bean 从一个 ClassPathXMLApplicationContext 转移到另一个?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9885350/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com