Как перевести бобы с одного 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
?
Я получаю beanFactory от myOneContext
и получаю его внутреннюю фабрику бинов как DefaultSingletonBeanRegistry
и вызываю registerSingleton
Object beanObject = my2ndContext.getBean("beanName");
DefaultSingletonBeanRegistry lbf =(DefaultSingletonBeanRegistry)myOneContext.getBeanFactory();
lbf.registerSingleton("beanName", beanObject);
это нормально? Я чувствую, что делаю что-то вроде взлома. также не уверен, что еще мне не хватает.
Другой вариант - сохранить компоненты в тех же контекстах и добавить родительские отношения между AppContexts и его фабриками компонентов.
myOneContext.setParent(my2ndContext);
DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory();
lbf.setParentBeanFactory(my2ndContext.getBeanFactory());
таким образом, все компоненты из обоих контекстов видны в myOneContext
Но проблема возникает, когда мне нужно уничтожить my2ndContext
, и я устанавливаю родителя BeanFactory в ноль.
DefaultListableBeanFactory lbf = (DefaultListableBeanFactory)myOneContext.getBeanFactory();
lbf.setParentBeanFactory(null); <<< throws exception
потому что это не позволяет изменять фабрику бобов.
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