Java: Spring: Как перевести bean-компоненты из одного ClassPathXMLApplicationContext в другой? - PullRequest
2 голосов
/ 27 марта 2012

Как перевести бобы с одного 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

1 Ответ

3 голосов
/ 27 марта 2012

Я рекомендую настроить выделенный родительский контекст со всей общей инфраструктурой внутри. Конкретные контексты приложения будут использовать этот в качестве своего родителя. Можно было бы обновить динамический контекст, оставив общую часть в родительской нетронутой.

Лучше всего сохранять иерархию родитель-потомок плоской - один родительский контекст и несколько дочерних контекстов. Перекрестные зависимости между контекстом приложения-брата, хотя и соблазняют поначалу, будут способствовать хаосу позже, а поддержка таких зависимостей потребует некоторых нетривиальных хаков или обходных путей.

Если этот вид родственных зависимостей является обязательным, взгляните на OSGI.

...