如何从ApplicationContext中删除单例spring bean?

jac*_*ope 26 lifecycle spring

我想开发一个模块控制系统,以便每个spring bean都可以由我自己的LifeCycle Controller管理.

但我无法弄清楚如何从ApplicationContext中删除单例Spring bean.

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

lis*_*sak 42

删除定义同时执行:删除定义和销毁(删除该bean上的所有容器引用)相应的Singleton:

((BeanDefinitionRegistry) beanFactory).removeBeanDefinition("myBean");
Run Code Online (Sandbox Code Playgroud)

如果你只需要删除单例,那么:

((DefaultListableBeanFactory) beanFactory).destroySingleton("myBean");
Run Code Online (Sandbox Code Playgroud)

如果你只注册单例但没有定义任何bean定义,那么后一种方法可能特别有用

((SingletonBeanRegistry) beanFactory).registerSingleton("myBean", myBeanInstance); 
Run Code Online (Sandbox Code Playgroud)


Boz*_*zho 22

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

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

BeanDefinitionRegistry factory = 
   (BeanDefinitionRegistry) applicationCtx.getAutowireCapableBeanFactory();
Run Code Online (Sandbox Code Playgroud)

(豆工厂实施BeanDefinitionRegistry).

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

  • 只是实现BeanFactoryAware,然后使用DefaultListableBeanFactory强制转换BeanFactory (2认同)