Как уничтожить существующий компонент и заменить его новым определением Spring - во время выполнения - PullRequest
0 голосов
/ 28 марта 2020

У меня есть сценарий, где у меня есть веб-приложение. В моем веб-приложении я импортировал «applicationContext. xml» из двух других файлов jar. В двух импортированных контекстных файлах мало общих компонентов. В одном из моих классов в веб-приложении у меня была ситуация, когда я использую функции из обоих jar-файлов.

Function 1 from jar 1 : getEmployeeDetails() - needs "employeeBean" - "com.practice.Employee"

Function 2 from jar 2 : getEmployeeSalaryBreakup() - needs "employeeBean" - "com.practice.compensation.Employee"

Теперь проблема в том, что второй вызов функции прерывается, потому что он не может отобразить боб. Это дает classCastException. Я не выполняю автоматическую раздачу bean-компонентов в моем веб-приложении, они вызываются в jar-файлах.

Одним из решений, которое я попробовал, было уничтожение существующего компонента и его повторная инициализация. Код PSB для того же:

/*
getEmployeeDetails()  //call here, uses employeeBean - com.practice.Employee
*/

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)applicationContext;

SingletonBeanRegistry registry = configContext.getBeanFactory();

registry.destroyBean("employeeBean"); //trying to destroy existing bean

registry.registerSingleton("employeeBean", "com.practice.compensation.Employee"); //reinitialize bean with new definition

/*
getEmployeeSalaryBreakup() //call here, expecting it will use new bean definition
*/

Вышеуказанная реализация не работает для меня, "registry.destroyBean (" employeeBean ");" - даже после выполнения этой строки старое определение bean-компонента все еще сохраняется.

Может кто-нибудь подсказать, что мне не хватает, или какое-то другое решение для выполнения sh этого. Как файлы JAR и их контекстные файлы не в моем контроле. Поэтому мне нужно справиться с этим на уровне веб-приложения.

Ответы [ 2 ]

0 голосов
/ 16 апреля 2020

Наконец, вот как это работает:

/*
call function getEmployeeDetails() //uses "employeeBean" - "com.practice.Employee"
*/

BeanDefinitionRegistry beanRegistry = (BeanDefinitionRegistry) applicationContext.getAutowireCapableBeanFactory();
BeanDefinition newBeanDefinition = BeanDefinitionBuilder.rootBeanDefinition(com.practice.compensation.Employee.class).getBeanDefinition();
BeanDefinition oldBeanDefinition = beanRegistry.getBeanDefinition("employeeBean");//this is needed if u want to revert your bean changes back to how it was
beanRegistry.registerBeanDefinition("employeeBean", newBeanDefinition);

/*
call function getEmployeeSalaryBreakup() //this will now execute as it gets required bean "employeeBean" - "com.practice.compensation.Employee"
*/

//reverting back bean changes
beanRegistry.registerBeanDefinition("employeeBean", oldBeanDefinition);
0 голосов
/ 28 марта 2020

Вы можете попробовать вызвать refre sh () в applicationContext после уничтожения / регистрации вашего компонента:

configContext.refresh()
...