Java Spring控制器单例对象
我对控制器对象有点困惑。据我所知,默认情况下,控制器是单例的。singleton是如何为web应用程序工作的,如下面的代码中所示,如果线程1执行到第9行,empId为12,线程2从线程1获得控制,empId为23,并完成整个方法的执行,那么当线程1再次执行时,empId的值将是12或23 我还注意到,UserServiceDao类只创建了一个对象,所以在SpringMVC中线程是如何管理的,每个线程都有自己的实例Java Spring控制器单例对象,java,spring,spring-mvc,Java,Spring,Spring Mvc,我对控制器对象有点困惑。据我所知,默认情况下,控制器是单例的。singleton是如何为web应用程序工作的,如下面的代码中所示,如果线程1执行到第9行,empId为12,线程2从线程1获得控制,empId为23,并完成整个方法的执行,那么当线程1再次执行时,empId的值将是12或23 我还注意到,UserServiceDao类只创建了一个对象,所以在SpringMVC中线程是如何管理的,每个线程都有自己的实例 1 public class ActionController { 2 3 @
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;
谢谢。控制器及其所有依赖项通常是无状态的,因此并发访问不成问题。特别是保持DAO无状态。在控制器中,没有任何实例变量来保持任何控制器方法调用的状态。所有变量都是方法(局部)变量,线程之间从不共享,因此以多线程方式使用它是没有问题的 这与使用servlet相同 方法(局部)变量驻留在堆栈上,其作用域仅限于方法的末尾。这里的
empId
是多个线程之间不共享的局部变量
同样,UserServiceDao
不应包含任何实例变量以保持其方法调用的状态
请看下图:
读取更多线程之间将共享int计数。那么您的意思是说实例变量在控制器、服务或存储库中的线程之间共享,并且您也可以共享图像,因为它不可见。当范围出现在图片中时,何时使用它?请参阅以下的