Как я могу удалить синглтон-бин из ApplicationContext? - PullRequest
25 голосов
/ 28 июля 2011

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

Но я не могу понять, как я могу удалить одиночную пружинуbean out of ApplicationContext.

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

Ответы [ 2 ]

36 голосов
/ 16 сентября 2012

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

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

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

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

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

((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance); 
22 голосов
/ 28 июля 2011

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

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

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

(фабрика бобов реализует BeanDefinitionRegistry).

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

...