据我了解,spring mvc 控制器默认是线程安全的(如 servlet)。但我只想知道控制器内的任何私有辅助方法都是线程安全的吗?
我在控制器类中有两个映射,例如:/test 和 test/success。每次用户调用此 url 时,我都想使用服务方法(两个不同的调用)检查数据库中的用户状态和激活时间。所以我决定创建一个私有助手方法来检查状态。那么有人能知道我的私有方法是线程安全的吗?
据我了解,spring mvc 控制器默认是线程安全的(如 servlet)。但我只想知道控制器内的任何私有辅助方法都是线程安全的吗?
我在控制器类中有两个映射,例如:/test 和 test/success。每次用户调用此 url 时,我都想使用服务方法(两个不同的调用)检查数据库中的用户状态和激活时间。所以我决定创建一个私有助手方法来检查状态。那么有人能知道我的私有方法是线程安全的吗?
所有请求都由您的控制器的一个实例处理(单例,因为它是一个弹簧管理的 bean)。因此,您需要确保不存储与一个请求相关的任何状态(在字段中)。
所以:
@Controller
@RequestMapping("/foo")
public class Foo {
@Autowired
private Something something;
@RequestMapping("/list")
public String foo() {
something.someMethod();
bar();
return "view"
}
private void bar() {
// something
}
}
可以,但是:
@Controller
@RequestMapping("/foo")
public class Foo {
private User theUser; // problem is ALL request share this field
@RequestMapping("/foo/{userId}")
public String foo(@PathVariable final Integer userId) {
if (theUser.getId().equals(userId)) {
// something
} else {
theUser = ...
}
return "view"
}
}
不是。
注意:未经测试(仅在此处键入,因此它甚至会伤害您的编译器)