如何重新初始化一个Spring Bean?

30
可以在运行时重新初始化Spring Bean吗?
我的Bean使用静态设置,在某些情况下会发生变化,然后我需要重新初始化该Bean。

1
你可以从上下文中访问bean,然后只需在bean类中创建一个名为“update”的方法,根据你的触发器调用该方法以更新bean。 - Amith Kumar
我的bean是配置类中的一个函数。更新函数适用于这种情况吗? - Fip
是的,即使您从方法中创建bean,它仍然是Spring上下文中的对象,并且可以像任何其他bean一样访问。 - Amith Kumar
1个回答

31

在Spring上下文中更新单例bean有三种选项,您可以选择适合您用例的一种:

在Bean内部创建重载方法
创建一个方法在您的bean内部,它将更新/重新加载其属性。根据您的触发器,从Spring上下文中访问该bean,然后调用重载方法来更新bean属性(由于是单例),它也将在Spring上下文和任何已自动装配/注入的地方进行更新。

删除并在注册表中重新注册Bean
您可以使用DefaultSingletonBeanRegistry来删除和重新注册您的bean。唯一的缺点是,它将不会刷新/重新加载已在使用中的消费者类中自动装配/注入的旧实例。

DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory();
registry.destroySingleton({yourbean}) //destroys the bean object
registry.registerSingleton({yourbeanname}, {newbeanobject}) //add to singleton beans cache

@RefreshScope
这个注解可用于根据配置更改来刷新bean属性值。但它的作用非常有限且具体化。点击此处了解更多信息。


1
重新加载属性真的很困难。 - Alex78191
4
这将只会从上下文中获取已加载的bean,而不会刷新/重新加载它。我不明白你说“这很难”是什么意思? - Amith Kumar
2
在我的情况下,使用 applicationContext.getBean(Bean.class) 返回的是新的 bean。这是由于 @Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE) - Alex78191
3
是的,这个问题不适用于非单例bean。原型作用域是每次使用,因此您的bean将为每个需求创建一个新实例,因此不存在重新加载的问题。 - Amith Kumar
1
我尝试从ApplicationContext中获取DefaultSingletonBeanRegistry,代码如下: DefaultSingletonBeanRegistry registry = (DefaultSingletonBeanRegistry) context.getBeanFactory(); 其中context对象的类型为ApplicationContext。 但是我遇到了以下错误:The method getBeanFactory() is undefined for the type ApplicationContext。 建议改为使用getParentBeanFactory(..)方法。 非常感谢您的帮助。 - Abhilash
显示剩余4条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接