2011-07-28 10 views
15

モジュール制御システムを開発して、すべてのSpring Beanを自分のLifeCycle Controllerで管理できるようにします。どのようにしてApplicationContextからシングルトンスプリングビーンを削除できますか?

しかし、私はどのようにシングルトンスプリングビーンをApplicationContextから取り除くことができないのか分かりません。

これは面白い問題かもしれませんが、解決する手助けはできますか?

+1

これは非常に特殊なことです。あなたは何を達成しようとしていますか?もしあなたが私たちにより高いレベルの記述を与えたら、おそらくより一般的な選択肢を提案することができます。 – skaffman

答えて

13

Bean定義を削除できます。 BeanDefinitionRegistryを取得し、それはあなたがあなたのアプリケーションを作成する方法によって異なりますが、Webアプリケーションで、たとえばあなたがで定義レジストリを取得することができますremoveDefinition(..)

を呼び出します(豆の工場がBeanDefinitionRegistryを実装)

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

Beanインスタンスも削除されるかどうかわかりません。試してみる。定義を削除

+2

はBeanFactoryAwareを実装してから、DefaultListableBeanFactoryでBeanFactoryをキャストします。 – jackalope

23

は両方を行います。あなたはちょうどそのシングルトンを削除する必要がある場合は

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

:定義と破壊シングルトンを対応する(そのBean上のすべてのコンテナの参照を削除)を除去

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

後者の方法は、シングルトンを登録しただけでビーン定義を定義していない場合、つまり有用なものです。つまり、

((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance); 
関連する問題