如何在以前自动连线的对象中重新初始化Bean对象?

时间:2019-05-28 07:44:41

标签: java spring-boot

我需要为所有以前自动连接的字段重新初始化单例bean实例。

我试图在应用程序上下文中从注册中删除该bean,然后重新注册新对象。

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
((DefaultListableBeanFactory) beanRegistry).destroySingleton("fbdProg");
((DefaultListableBeanFactory) beanRegistry).registerSingleton("fbdProg", program);

它仅在第一次调用时工作一次。

问题是如何重新初始化Bean,以使新实例在其他类中可以自动装配

2 个答案:

答案 0 :(得分:0)

如果每次注入该bean都需要一个新实例,则可以在bean上使用@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)。例如:

@Component
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE)
public class MyComponent {
    // methods, fields, etc.
}

然后,每当Spring注入到另一个组件中时,它都会创建一个MyComponent的新实例。因此, Bean A 与{strong> Bean B 具有不同的MyComponent实例,从而将beanA.myComponent != beanB.myComponent评估为true

答案 1 :(得分:0)

在春季启动时,每个带有@Bean批注的类默认情况下都是单例,但是如果希望变量的生命周期与之相关,则可以提供@Scope批注

  • 一个会议
  • http请求
  • serveletContext的生活

无论如何,您必须记住@Bean应该是单例的,例如在持久性模式中,您有一个实体和一个存储库。储存库应该是单调的,因为它本质上仅提供存储和检索实体的方法,而实体则不应是单调的,因为您必须为存储在数据库中的每个对象都需要一个实体。服务也一样。您可能还想看看这篇文章:spring boot scopes