当前位置: 首页 > 知识库问答 >
问题:

Spring控制器单例对象

訾渝
2023-03-14

我对控制器对象有点困惑。据我所知,默认情况下,控制器是单例的。singleton是如何为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个答案

谢英光
2023-03-14

控制器及其所有依赖项通常是无状态的,因此并发访问不成问题。尤其是保持DAO的无状态。

拓拔君博
2023-03-14

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

这与使用servlet相同。

方法(局部)变量驻留在堆栈上,其作用域仅限于方法的末尾。这里的empId是多个线程之间不共享的局部变量。

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

请看下图:

阅读仅包含局部变量的实例方法的更多线程安全性

 类似资料:
  • 问题内容: 我有一个关于Spring 3 MVC 的查询。收到请求时,容器是否为每个请求(类似于Struts 2中的Action -ThreadLocal )创建控制器的新实例,还是单个实例响应所有请求?默认情况下,控制器bean是上下文中的单例吗? Spring 3 MVC应用程序有哪些准则/最佳实践?这些设置可以配置吗?应该配置这些吗?如果我的环境是集群环境,它是否会发生很大变化-我猜应该不会

  • 我有一个用于原型bean的FactoryBean,如下所示: 我希望在控制器中自动连接它,并且每当我尝试访问属性时(通过,从获得一个新的原型实例: 但是,这从来不会调用getObject()。如果我注入ApplicationContext一个直接访问bean,它就会工作,提供一个全新的属性bean: 如何直接使用@autowired注入来实现?

  • 我试图通过AJAX向Spring控制器发送JSON对象,但收到错误415: 下面是我的javascript调用- 这里是我的依赖项杰克逊相关的依赖项在我的POM- 讽刺的是,当我试着穿Spring靴的时候,它就起作用了。

  • 问题内容: 我在Ubuntu16.04上将Symfony3与PhpStorm.2016.3.2一起使用 我之前从未做过AJAX请求,并且想测试从view->到controller->的控制器调用,该调用将答案发送回JSON中的视图。 所以我读了文档,但它们都很具体。因此,我的愿望是只能在视图中编写一个简单的AJAX请求,以便对其进行测试,调用控制器并在视图中返回答案。 这是我的看法: 我的控制器:

  • 如何获得对我的控制器类的引用? 这是我的代码片段。 Controller类在FXML中的fx:控制器属性中指定。实例在后台自动创建。我需要访问该实例才能在表单中设置初始值。 我知道我可以用XML设置初始值,但我需要在运行时设置它们。

  • spring-test模块对测试控制器@Controller提供了最原生的支持。详见14.6 "Spring MVC测试框架"一节。