如何在运行时销毁现有的bean并替换为新的定义Spring-during



我有一个场景,其中有一个web应用程序。在我的web应用程序中,我从另外两个jar文件中导入了"applicationContext.xml"。在两个导入的上下文文件中几乎没有常见的bean。在我的一个web应用程序类中,我遇到了一种情况,即我正在使用两个jar中的函数。

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

现在的问题是,第二个函数调用正在中断,因为它无法映射bean。它给出了类CastException。我并没有在我的web应用程序中自动连接bean,它们是在jar文件中调用的。

我尝试的解决方案之一是销毁现有的bean并重新初始化。相同的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.dedestroyBean("employeeBean"(;"-即使在执行了这一行之后,旧的bean定义仍然存在。

有人能建议我缺少什么吗,或者其他解决方案来实现这一点。由于jar文件及其上下文文件不在我的控制范围内。所以我需要在网络应用程序级别处理这个问题。

最后它是这样工作的:

/*
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);

您可以在销毁/注册您的bean后,尝试在applicationContext上调用refresh((:

configContext.refresh()

最新更新