web-dev-qa-db-ja.com

ApplicationContextからシングルトンSpring Beanを削除するにはどうすればよいですか?

モジュール制御システムを開発して、すべてのSpring Beanを自分のLifeCycle Controllerで管理できるようにしたいと考えています。

しかし、ApplicationContextからシングルトンSpring Beanを削除する方法を理解できません。

それは興味深い問題かもしれませんが、私が解決するのを手伝ってくれませんか?

30
jackalope

Bean定義を削除してみてください。 BeanDefinitionRegistry を取得し、removeDefinition(..)を呼び出します

これは、アプリケーションの作成方法によって異なりますが、たとえばWebアプリケーションでは、次の方法で定義レジストリを取得できます。

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

(BeanファクトリはBeanDefinitionRegistryを実装しています)。

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

22
Bozho

定義を削除すると、定義の削除と対応するシングルトンの破棄(そのBean上のすべてのコンテナ参照の削除)の両方が行われます。

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

シングルトンを削除する必要がある場合:

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

後者の方法は、シングルトンを登録しただけでBean定義を定義していない場合に特に便利です。

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