【发布时间】:2021-03-03 03:31:12
【问题描述】:
我是春天的新手。在阅读documentation 时,我发现它提到了这一点
Bean 默认作用域是单例。
如果容器中只有一个实例,那么“它在多线程环境中的行为方式”。
通常在任何 Web 应用程序中,多个请求将同时完成,如果一个 POJO 类是自动装配的并且多个请求同时完成,那么 getter 和 setter 将相互交叉数据。请求 1 设置数据,同时请求 2 覆盖。请求 1 获取请求 2 的覆盖数据。
Like Foo 是一个 POJO 类,它的 get 和 set 不同步。
@Service
public class Foo {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
@Autowired
private Foo foo;
@RequestMapping(value = "foo" , method = RequestMethod.POST )
public String saveFoo(@RequestBody String fooname){
foo.setName(fooname); // In case of multiple request
//get and set will be happing on same instance could be wrong
return foo.getName();
}
在多线程环境中处理 Autowire 和 POJO 的理想方式是什么?开发者是否必须提及原型范围?
【问题讨论】:
-
Spring bean 不是线程安全的.......提供线程安全是您的责任。
-
yu 使用 spring 并不意味着 一切 都必须由 Spring 管理。为此,在您需要时创建一个
Foo,它是完全线程安全的。您当前的代码不是将状态保持在单例中。