spring mvc controller里面的私有方法是线程安全的

时间:2013-10-03 19:58:29

标签: java multithreading spring spring-mvc

据我所知,spring mvc控制器默认是线程安全的(如servlet)。但我只是想知道控制器内的任何私有帮助器方法都是线程安全的吗?

我在控制器类中有两个映射,例如:/ test和test / success。每次用户调用此URL时,我都想使用服务方法(两个不同的调用)检查数据库中的用户状态和激活时间。所以我决定创建一个私有帮助方法来检查状态。 那么有谁能知道我的私有方法是线程安全的吗?

1 个答案:

答案 0 :(得分:4)

所有请求都由您的控制器的一个实例处理(单例,因为它是一个Spring托管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"
    }
}

不是。

注意:未经测试(仅在此输入,因此甚至可能会伤害您的编译器)