web-dev-qa-db-fra.com

Comment puis-je supprimer un haricot de printemps singleton d'ApplicationContext?

Je souhaite développer un système de contrôle de module afin que chaque haricot de printemps puisse être géré par mon propre LifeCycle Controller.

Mais je ne peux pas comprendre comment puis-je supprimer un haricot de printemps singleton d'ApplicationContext.

Cela peut être un problème intéressant, pouvez-vous m'aider à le résoudre?

30
jackalope

Vous pouvez essayer de supprimer la définition du bean. Obtenez le BeanDefinitionRegistry et appelez removeDefinition(..)

Cela dépend de la façon dont vous créez votre application, mais par exemple, dans une application Web, vous pouvez obtenir le registre de définition en:

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

(la fabrique de bean implémente BeanDefinitionRegistry).

Je ne sais pas si l'instance de bean sera également supprimée. Essaie.

22
Bozho

La suppression de la définition fait les deux: la suppression de la définition et la destruction (en supprimant toutes les références de conteneur sur ce bean) Singleton correspondant:

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

Si vous avez juste besoin de supprimer le singleton, alors:

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

Cette dernière méthode peut être particulièrement utile si vous venez d'enregistrer un singleton mais que vous n'avez défini aucune définition de bean, i.e.

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