モジュール制御システムを開発して、すべてのSpring Beanを自分のLifeCycle Controllerで管理できるようにします。どのようにしてApplicationContextからシングルトンスプリングビーンを削除できますか?
しかし、私はどのようにシングルトンスプリングビーンをApplicationContextから取り除くことができないのか分かりません。
これは面白い問題かもしれませんが、解決する手助けはできますか?
モジュール制御システムを開発して、すべてのSpring Beanを自分のLifeCycle Controllerで管理できるようにします。どのようにしてApplicationContextからシングルトンスプリングビーンを削除できますか?
しかし、私はどのようにシングルトンスプリングビーンをApplicationContextから取り除くことができないのか分かりません。
これは面白い問題かもしれませんが、解決する手助けはできますか?
Bean定義を削除できます。 BeanDefinitionRegistry
を取得し、それはあなたがあなたのアプリケーションを作成する方法によって異なりますが、Webアプリケーションで、たとえばあなたがで定義レジストリを取得することができますremoveDefinition(..)
を呼び出します(豆の工場がBeanDefinitionRegistry
を実装)
BeanDefinitionRegistry factory =
(BeanDefinitionRegistry) applicationCtx.getAutowireCapableBeanFactory();
。
Beanインスタンスも削除されるかどうかわかりません。試してみる。定義を削除
はBeanFactoryAwareを実装してから、DefaultListableBeanFactoryでBeanFactoryをキャストします。 – jackalope
は両方を行います。あなたはちょうどそのシングルトンを削除する必要がある場合は
((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");
:定義と破壊シングルトンを対応する(そのBean上のすべてのコンテナの参照を削除)を除去
((DefaultListableBeanFactory) beanFactory).destroySingleton("myBean");
後者の方法は、シングルトンを登録しただけでビーン定義を定義していない場合、つまり有用なものです。つまり、
((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance);
これは非常に特殊なことです。あなたは何を達成しようとしていますか?もしあなたが私たちにより高いレベルの記述を与えたら、おそらくより一般的な選択肢を提案することができます。 – skaffman