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

Abh*_*hek 13 java spring spring-mvc

所以,标题非常简单.我有一个处理器类DynamicBeanHandler,它实现BeanDefinitionRegistryPostProcessor了spring提供的接口.在这个类中,我添加了多个SCOPE_SINGLETONbean,其bean类设置MyDynamicBean如下 -

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

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

稍后,我SpringUtil.getBean(dynamicBeanId)将获取类实现所需的MyDynamicBean实例.这一切都很棒.当我想要删除其中一个实例并稍后在没有注册表实例的地方添加新实例时,就会出现问题.有人可以帮我找到办法吗?SpringUtilApplicationContextAware

以下是课程代码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);
    }
}
Run Code Online (Sandbox Code Playgroud)

dev*_*per 19

您可以使用BeanDefinitionRegistry(在这里查看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);
}
Run Code Online (Sandbox Code Playgroud)