Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring控制器单例对象_Java_Spring_Spring Mvc - Fatal编程技术网

Java Spring控制器单例对象

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 @

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

我还注意到,UserServiceDao类只创建了一个对象,所以在SpringMVC中线程是如何管理的,每个线程都有自己的实例

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计数。那么您的意思是说实例变量在控制器、服务或存储库中的线程之间共享,并且您也可以共享图像,因为它不可见。当范围出现在图片中时,何时使用它?请参阅以下的