我目前正在努力了解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.updateAObject
。 CustomeA
之外的任何类仍具有较旧的引用,而没有较新的引用。相反,您应该修改CustomeA.updateAObject
,以便与引用aObject
对应的对象的属性得到更新。这样,所有带有aObject
引用的类都可以看到与aObject
引用相对应的更新对象。
您的困惑是因为您不了解对象与对象引用之间的区别。 aObject
是对基础对象的引用。 aObject
不是对象。