Как я могу удалить singleton spring bean из ApplicationContext?

Я хочу разработать систему управления модулем, чтобы каждый spring bean мог управлять моим собственным контроллером LifeCycle.

Но я не могу понять, как удалить одноэлемент spring bean из ApplicationContext.

Это может быть интересной проблемой, вы можете помочь мне решить?

Ответы

Ответ 1

Вы можете попробовать удалить определение bean. Получите BeanDefinitionRegistry и вызовите removeDefinition(..)

Это зависит от способа создания приложения, но, например, в веб-приложении вы можете получить реестр определения:

BeanDefinitionRegistry factory = 
   (BeanDefinitionRegistry) applicationCtx.getAutowireCapableBeanFactory();

(bean factory реализует BeanDefinitionRegistry).

Я не знаю, удалит ли экземпляр bean. Попробуйте.

Ответ 2

Удаление определения делает так: удаление определения и уничтожение (удаление всех ссылок на контейнеры на этом bean), соответствующее Singleton:

((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");

Если вам просто нужно удалить синглтон, то:

((DefaultListableBeanFactory) beanFactory).destroySingleton("myBean");

Последний способ может быть особенно полезен, если вы только что зарегистрировали singleton, но не определили определения bean, т.е.

((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance);