如何在Spring WebApplicationContext运行时添加bean实例?

2024-05-22

所以,标题非常简单。我有一个处理程序类DynamicBeanHandler它实现了BeanDefinitionRegistryPostProcessorspring提供的接口。在这堂课中,我添加了多个SCOPE_SINGLETONbean 类设置为的 beansMyDynamicBean如下-

GenericBeanDefinition myBeanDefinition = new GenericBeanDefinition();
myBeanDefinition.setBeanClass(MyDynamicBean.class);
myBeanDefinition.setScope(SCOPE_SINGLETON);
myBeanDefinition.setPropertyValues(getMutableProperties(dynamicPropertyPrefix));
registry.registerBeanDefinition(dynamicBeanId, myBeanDefinition);

方法getMutableProperties()返回一个对象MutablePropertyValues.

后来我就这样SpringUtil.getBean(dynamicBeanId)来获取所需的MyDynamicBean实例,其中SpringUtil类工具ApplicationContextAware。这一切都非常有效。当我想删除这些实例之一并稍后在没有注册表实例的地方添加一个新实例时,问题就出现了。谁能帮我找到一种方法来做到这一点?

以下是类的代码SpringUtil-

public class SpringUtil implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        SpringUtil.applicationContext = applicationContext;
    }

    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    public static Object getBean(String beanId) {
        return applicationContext.getBean(beanId);
    }

    public static <T> T getBean(String beanId, Class<T> beanClass) {
        return applicationContext.getBean(beanId, beanClass);
    }
}

您可以利用BeanDefinitionRegistry (look here http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/beans/factory/support/BeanDefinitionRegistry.html对于 API)来动态删除或注册 Bean。

所以,在你的SpringUtil类中,您可以添加以下方法来删除现有的 bean 定义:removeBeanDefinition()然后使用添加新的 bean 定义registerBeanDefinition().

public void removeExistingAndAddNewBean(String beanId) {

   AutowireCapableBeanFactory factory = 
                   applicationContext.getAutowireCapableBeanFactory();
   BeanDefinitionRegistry registry = (BeanDefinitionRegistry) factory;
   registry.removeBeanDefinition(beanId);

    //create newBeanObj through GenericBeanDefinition

    registry.registerBeanDefinition(beanId, newBeanObj);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在Spring WebApplicationContext运行时添加bean实例? 的相关文章

随机推荐