2011-07-28 3 views
15

모듈 제어 시스템을 개발하여 모든 스프링 빈을 내 LifeCycle Controller에서 관리 할 수 ​​있습니다.어떻게 ApplicationContext에서 싱글 톤 스프링 빈을 제거 할 수 있습니까?

하지만 어떻게 Singleton Spring Bean을 ApplicationContext 밖으로 제거 할 수 있는지 알 수 없습니다.

흥미로운 문제 일 수 있습니다. 해결하도록 도와 줄 수 있습니까?

+1

이것은 매우 특이한 일입니다. 무엇을 성취하려고합니까? 우리에게 더 높은 수준의 설명을 주면 아마도 더 일반적인 대안을 제안 할 수있을 것입니다. – skaffman

답변

13

빈 정의를 제거해보십시오.

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

(빈 공장 BeanDefinitionRegistry를 구현) 다음 BeanDefinitionRegistry을 얻고 그것은 당신이 당신의 응용 프로그램을 만드는 방법에 따라 달라집니다 removeDefinition(..)

부르지 만, 웹 응용 프로그램의 예를 들어, 당신은에 의해 정의 레지스트리를 얻을 수 있습니다.

Bean 인스턴스도 제거 될지 모르겠습니다. 시도 해봐.

+2

은 BeanFactoryAware를 구현 한 다음 DefaultListableBeanFactory로 BeanFactory를 형 변환합니다. – jackalope

23

제거 정의는 모두 수행합니다 정의를 제거하고 해당 (그 콩의 모든 컨테이너 참조를 제거) 파괴 싱글 :

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

을 :

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

그냥 다음 싱글을 제거해야하는 경우 후자는 싱글 톤을 등록했지만 빈 정의를 정의하지 않은 경우에 특히 유용 할 수 있습니다. 즉

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