我需要为所有以前自动连接的字段重新初始化单例bean实例。
我试图在应用程序上下文中从注册中删除该bean,然后重新注册新对象。
ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
((DefaultListableBeanFactory) beanRegistry).destroySingleton("fbdProg");
((DefaultListableBeanFactory) beanRegistry).registerSingleton("fbdProg", program);
它仅在第一次调用时工作一次。
问题是如何重新初始化Bean,以使新实例在其他类中可以自动装配
答案 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批注
无论如何,您必须记住@Bean应该是单例的,例如在持久性模式中,您有一个实体和一个存储库。储存库应该是单调的,因为它本质上仅提供存储和检索实体的方法,而实体则不应是单调的,因为您必须为存储在数据库中的每个对象都需要一个实体。服务也一样。您可能还想看看这篇文章:spring boot scopes