我目前正在努力了解Spring中的bean。我试图通过我的项目中当前发生的情况来了解Bean。我在Docker容器中有一个Spring应用程序。在启动过程中,我的应用程序应该构建一个繁重的实例,该实例需要很长时间才能创建。现在,我的应用程序是通过连接的消息队列。每当我的应用程序收到一条消息时,它都应使用我的重实例来继续处理该消息。

我了解默认情况下,Spring bean默认为Singleton,并且没有任何配置就无法创建另一个实例。 Spring将始终通过第一个调用使用第一个实例。

现在,我想创建一个持有该对象的客户类。 aObject是在启动期间创建的,具有我需要的所有信息。如果我现在使用updateAObject()更新我的aObject。是否会将所有使用CustomeA类的类的aObject更改为新值?我需要处理并发问题吗?

我写了一个Junittest,但我无法确认我的解决方案是否是-ok-

对不起,我的英语不太好。我努力变得更好。

@Component
@Scope(value = ConfigurableBeanFactory.SCOPE_SINGLETON)
public class CustomeA {

    private ClassA aObject;

    public ClassA() {
        this.aObject = createHeavyCostInstance();
    }

    public ClassA createHeavyCostInstance() {
        // do something here that takes long time to do
        return object;
    };

    public ClassA updateAObject() {
        this.aObject = update();
    }

    // Getter and Setter
}

@Configuration
@ComponentScan("com.package.config.dummy")
public class AppConfig {

}

//TestClass
@Test
public void testConfig() {
    AnnotationConfigApplicationContext context =
            new AnnotationConfigApplicationContext(AppConfig.class);

    ClassA classA = context.getBean(ClassA.class);
    classA.getAObject();
    classA.setAObject(new Object());
    ClassA classA_two = context.getBean(classA.class);
    classA_two.getAObject();
    context.close();
}

最佳答案

您正在aObject中重新分配CustomeA.updateAObjectCustomeA之外的任何类仍具有较旧的引用,而没有较新的引用。相反,您应该修改CustomeA.updateAObject,以便与引用aObject对应的对象的属性得到更新。这样,所有带有aObject引用的类都可以看到与aObject引用相对应的更新对象。

您的困惑是因为您不了解对象与对象引用之间的区别。 aObject是对基础对象的引用。 aObject不是对象。

10-01 18:53