Spring Controller singleton Object

时间:2015-04-17 16:07:14

标签: java spring spring-mvc

我对控制器对象有点困惑。据我所知,默认情况下控制器是单例。单例如何为Web应用程序工作,如下面的代码,如果线程1执行到第9行并且将empId作为12并且线程2从线程1获取控制并且将empId作为23并且完成整个方法的执行然后再次执行线程1执行empId的值将是12或23.

而且我注意到只为UserServiceDao类创建了一个对象,所以如何在spring mvc中管理线程,每个线程都有自己的实例。

1 public class ActionController {
2
3   @Autowired
4   UserServiceDao userServiceDao;
5   
    int count = 1;
6   
7   @RequestMapping("/dashboard.htm")
8       public ModelAndView dashboard(HttpServletRequest request) {
9           String empId = request.getParameter("empId");
10          UserProfile userProfile = userServiceDao.loadEmpById(empId);
            System.out.println(count);
            count++;

11      }
12  }

    Thread first output: 1;
    Thread second output : 2; 

感谢。

2 个答案:

答案 0 :(得分:1)

在控制器中,您没有任何实例变量来保持任何控制器方法的调用状态。所有变量都是从不在线程之间共享的方法(本地)变量,因此在多线程方式中使用它是没有问题的。

与使用servlet相同。

方法(本地)变量驻留在堆栈上,并且范围仅限于方法的结尾。这里empId是不在多个线程之间共享的局部变量。

以同样的方式,UserServiceDao不应包含任何实例变量来保持其方法调用的状态。

请看下图:

enter image description here

了解更多Thread safety of instance methods that have local variables only

答案 1 :(得分:0)

控制器及其所有依赖项通常都是无状态的,因此并发访问并不是一件令人担忧的事情。特别是让你的DAO无国籍。