【问题标题】:How to reinitialize a Spring Bean?如何重新初始化 Spring Bean?
【发布时间】:2018-12-15 12:24:06
【问题描述】:

是否可以在运行时重新初始化 Spring Bean?

我的 Bean 使用静态设置,在某些情况下会发生变化,然后我必须重新初始化 bean。

【问题讨论】:

  • 你可以从上下文中访问bean,然后在bean类中创建一个方法update,你可以根据你的触发器调用它来更新bean。
  • 我的 bean 是配置类中的一个函数。更新功能是否适用于这种组合?
  • 是的,即使您从方法创建 bean,它仍然是 spring 上下文中的一个对象,并且可以像任何其他 bean 一样访问。

标签: java spring spring-boot spring-bean


【解决方案1】:

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

Bean 中的重载方法
在您的 bean 中创建一个方法,该方法将更新/重新加载其属性。根据您的触发器,从 spring 上下文中访问 bean,然后调用 reload 方法来更新 bean 属性(因为单例),它也将在 spring 上下文中以及它被自动装配/注入的任何地方更新。

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

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

@RefreshScope
对于从配置更改中刷新 bean 值属性很有用。但它的用途非常有限和特定。 Resource 了解更多信息。

【讨论】:

  • 重新加载属性太难了。
  • 为什么不只是bean = applicationContext.getBean(Bean.class)
  • 因为它只会从上下文中获取已经加载的 bean,而不是刷新/重新加载它。我不明白你说的这么难?
  • 在我的情况下,applicationContext.getBean(Bean.class) 返回了新的 bean。这是因为@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
  • 是的,这个问题不适用于非单例 bean。原型范围是每次使用的,因此您的 bean 会针对每个需求创建新的,因此不存在重新加载的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-02
  • 2018-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多