创建、更新和管理 Spring 个 Bean
Create, Update and Manage Spring Beans
我目前正在努力理解 Spring 中的 beans。我试图通过我项目中当前发生的一个场景来理解Beans。我在 Docker 容器中有一个 Spring 应用程序。在启动期间,我的应用程序应该构建一个需要很长时间才能创建的繁重实例。现在,我的应用程序是通过一个消息队列连接起来的。每次我的应用程序收到消息时,它都应该使用我的重实例来处理消息。
我知道 Spring 默认情况下单例是一个 bean,没有任何配置就不可能创建另一个实例。 Spring 将始终通过第一次调用使用第一个实例。
现在我想创建一个持有对象的客户 class。 aObject 是在启动期间创建的,并且包含我需要的所有信息。如果我现在用 updateAObject() 更新我的 aObject。它会将我的 aObject 更改为所有使用我的 CustomeA class 的 class 的新值吗?我需要处理并发问题吗?
我写了一个 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();
}
您正在 CustomeA.updateAObject
内重新分配 aObject
。 CustomeA
之外的任何 class 仍然具有较旧的引用,而不是较新的引用。相反,您应该修改 CustomeA.updateAObject
,以便更新与引用 aObject
对应的对象的属性。这样,所有带有 aObject
引用的 classes 都可以看到与 aObject
引用相对应的更新对象。
你的困惑是因为你不理解对象和对象引用之间的区别。 aObject
是对基础对象的引用。 aObject
不是对象。
我目前正在努力理解 Spring 中的 beans。我试图通过我项目中当前发生的一个场景来理解Beans。我在 Docker 容器中有一个 Spring 应用程序。在启动期间,我的应用程序应该构建一个需要很长时间才能创建的繁重实例。现在,我的应用程序是通过一个消息队列连接起来的。每次我的应用程序收到消息时,它都应该使用我的重实例来处理消息。
我知道 Spring 默认情况下单例是一个 bean,没有任何配置就不可能创建另一个实例。 Spring 将始终通过第一次调用使用第一个实例。
现在我想创建一个持有对象的客户 class。 aObject 是在启动期间创建的,并且包含我需要的所有信息。如果我现在用 updateAObject() 更新我的 aObject。它会将我的 aObject 更改为所有使用我的 CustomeA class 的 class 的新值吗?我需要处理并发问题吗?
我写了一个 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();
}
您正在 CustomeA.updateAObject
内重新分配 aObject
。 CustomeA
之外的任何 class 仍然具有较旧的引用,而不是较新的引用。相反,您应该修改 CustomeA.updateAObject
,以便更新与引用 aObject
对应的对象的属性。这样,所有带有 aObject
引用的 classes 都可以看到与 aObject
引用相对应的更新对象。
你的困惑是因为你不理解对象和对象引用之间的区别。 aObject
是对基础对象的引用。 aObject
不是对象。