Java 如何在以前自动连接的对象中重新绑定bean对象?

Java 如何在以前自动连接的对象中重新绑定bean对象?,java,spring-boot,Java,Spring Boot,我需要为所有以前自动连接的字段重新生成Singletonbean实例 我试图在应用程序上下文中从注册表中删除bean,并重新注册新对象 ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext; SingletonBeanRegistry beanRegistry = configContext.getBeanFactory(); ((DefaultListableBeanF

我需要为所有以前自动连接的字段重新生成Singletonbean实例

我试图在应用程序上下文中从注册表中删除bean,并重新注册新对象

ConfigurableApplicationContext configContext = (ConfigurableApplicationContext)appContext;
SingletonBeanRegistry beanRegistry = configContext.getBeanFactory();
((DefaultListableBeanFactory) beanRegistry).destroySingleton("fbdProg");
((DefaultListableBeanFactory) beanRegistry).registerSingleton("fbdProg", program);
第一次调用时,它只工作一次


问题是如何重新控制bean以使新实例在其他类中可用,在其他类中它是自动连接的

如果每次注入时都需要这个bean的新实例,那么可以在bean上使用
@Scope(ConfigurableBeanFactory.Scope\u PROTOTYPE)
。例如:

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

然后,每次将Spring注入另一个组件时,它都会创建一个新的
MyComponent
实例。因此Bean A将有一个与Bean B不同的
MyComponent
实例,评估
beanA.MyComponent!=beanB.myComponent
true

在spring boot中,默认情况下,每个带有@Bean注释的类都是单例的,但是如果希望变量的lifehook与之相关,则可以提供@Scope注释

  • 会议
  • http请求
  • ServletContext的lifehook

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

“我需要重新生成SingletonBean实例”=>为什么?最好是简单地更改已经实例化的bean。将bean范围更改为原型不适合您吗?@Seelenvirtuose,当然,但是如何在所有自动连接的“ref”之间共享新实例的ref?不要创建新实例。感觉像是一个网络控制器。其想法是一个网络控制器从前端获取命令,将某些内容加载到类的新实例中。同时,这个实例应该被其他类使用(比如,新加载的实例,但是加载在其他控制器中)。我需要在运行时重新创建singleton实例,然后在所有自动连接的“ref”中共享对新实例的ref。比如,很少有对象使用可以在运行时重新创建的一个bean。根据定义,sigletone是一个在应用程序运行的所有时间都“存在”的不可变距离,所以我的问题是为什么要破坏一个单音?为什么要修改?提供一些关于您在应用程序中尝试执行的操作的更详细信息