我知道默认情况下,Springton Singleton是一个Spring bean,并且没有任何配置,就不可能创建另一个实例。 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();
}
答案 0 :(得分:0)
您正在aObject
内部重新分配CustomeA.updateAObject
。 CustomeA
之外的任何类仍具有较旧的引用,而没有较新的引用。相反,您应该修改CustomeA.updateAObject
,以便与引用aObject
相对应的对象的属性得到更新。这样,所有带有aObject
引用的类都可以看到与aObject
引用相对应的更新对象。
您的困惑是因为您不了解对象与对象引用之间的区别。 aObject
是对基础对象的引用。 aObject
不是对象。