モジュール制御システムを開発して、すべてのSpring Beanを自分のLifeCycle Controllerで管理できるようにしたいと考えています。
しかし、ApplicationContextからシングルトンSpring Beanを削除する方法を理解できません。
それは興味深い問題かもしれませんが、私が解決するのを手伝ってくれませんか?
Bean定義を削除してみてください。 BeanDefinitionRegistry
を取得し、removeDefinition(..)
を呼び出します
これは、アプリケーションの作成方法によって異なりますが、たとえばWebアプリケーションでは、次の方法で定義レジストリを取得できます。
BeanDefinitionRegistry factory =
(BeanDefinitionRegistry) applicationCtx.getAutowireCapableBeanFactory();
(BeanファクトリはBeanDefinitionRegistry
を実装しています)。
Beanインスタンスも削除されるかどうかはわかりません。試してみる。
定義を削除すると、定義の削除と対応するシングルトンの破棄(そのBean上のすべてのコンテナ参照の削除)の両方が行われます。
((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");
シングルトンを削除する必要がある場合:
((DefaultListableBeanFactory) beanFactory).destroySingleton("myBean");
後者の方法は、シングルトンを登録しただけでBean定義を定義していない場合に特に便利です。
((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance);