我对控制器对象有点困惑。据我所知,默认情况下控制器是单例。单例如何为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;
感谢。
答案 0 :(得分:1)
在控制器中,您没有任何实例变量来保持任何控制器方法的调用状态。所有变量都是从不在线程之间共享的方法(本地)变量,因此在多线程方式中使用它是没有问题的。
与使用servlet相同。
方法(本地)变量驻留在堆栈上,并且范围仅限于方法的结尾。这里empId
是不在多个线程之间共享的局部变量。
以同样的方式,UserServiceDao
不应包含任何实例变量来保持其方法调用的状态。
请看下图:
了解更多Thread safety of instance methods that have local variables only
答案 1 :(得分:0)
控制器及其所有依赖项通常都是无状态的,因此并发访问并不是一件令人担忧的事情。特别是让你的DAO无国籍。