如何从ApplicationContext中删除单例Springbean?

如何从ApplicationContext中删除单例Springbean?,spring,lifecycle,Spring,Lifecycle,我想开发一个模块控制系统,这样每个SpringBean都可以由我自己的LifeCycle Controller管理 但我不知道如何从ApplicationContext中删除单例Springbean 这可能是一个有趣的问题,您能帮我解决吗?您可以尝试删除bean定义。获取并调用removeDefinition(..) 这取决于您创建应用程序的方式,但例如,在web应用程序中,您可以通过以下方式获得定义注册表: BeanDefinitionRegistry factory = (BeanD

我想开发一个模块控制系统,这样每个SpringBean都可以由我自己的LifeCycle Controller管理

但我不知道如何从ApplicationContext中删除单例Springbean


这可能是一个有趣的问题,您能帮我解决吗?

您可以尝试删除bean定义。获取并调用
removeDefinition(..)

这取决于您创建应用程序的方式,但例如,在web应用程序中,您可以通过以下方式获得定义注册表:

BeanDefinitionRegistry factory = 
   (BeanDefinitionRegistry) applicationCtx.getAutowireCapableBeanFactory();
(bean工厂实现
BeanDefinitionRegistry


我不知道bean实例是否也会被删除。试试看。

删除定义既可以删除定义,也可以销毁(删除该bean上的所有容器引用)对应的单例:

((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");
如果您只需要删除singleton,则:

((DefaultListableBeanFactory) beanFactory).destroySingleton("myBean");
如果您只是注册了singleton,但还没有定义任何bean定义,那么后一种方法可能特别有用

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

这是一件非常奇怪的事情。你想达到什么目标?如果您给我们一个更高层次的描述,也许我们可以建议一个更传统的替代方案。只需实现BeanFactoryAware,然后使用DefaultListableBeanFactory强制转换BeanFactory