当前位置: 首页 > 面试题库 >

Spring MVC如何处理多个用户

孔彭祖
2023-03-14
问题内容

我无法理解与以下情况相关的这种基本机制。

我有一个spring网络应用程序。现在,我将模型自动连接到控制器中。基于url匹配,它将调用相应的方法。我所有的方法都是单例。

现在,当两个用户同时打开应用程序时,spring可以并行运行它们并为他们提供结果。我不明白它怎么做。我的意思是因为bean是单例的,所以必须等到不使用bean或覆盖bean中的数据。但是弹簧工作正常。有人可以用一些类比来解释这种行为。

为了清楚地说明我的问题,下面是一段代码:

我的默认控制器很简单:

@Autowired  
private AppModel aModel; 
public AppModel getModel(){
    return aModel;
}
public void setModel(AppModel aModel){
    this.aModel = aModel;
}

@RequestMapping(method = RequestMethod.GET)
public ModelAndView defaultGetter(HttpServletRequest request,
        HttpServletResponse response) throws Exception {
    ModelAndView mav = new ModelAndView(getViewName());
    mav.addObject("model", aModel);
    Runtime.getRuntime().gc();
    return mav;
}

也可以有人告诉我,当两个客户端打开应用程序时,当我使用@autowired时,将生成两个单独的模型。如果所有客户仅存在一个模型bean,则说来自客户1的请求进入,我花了30秒钟才能得到结果。现在,如果第二个客户端在3秒钟内发送请求,那么第一个客户端的请求会被覆盖吗?

我觉得我很困惑。有人可以澄清这种魔术是如何发生的吗?

谢谢


问题答案:

每个Web请求都会生成一个新线程,如该线程中所述。

Spring管理不同的作用域(原型,请求,会话,单例)。如果两个同时请求访问一个单例bean,则该bean必须是无状态的(或至少是同步的,以避免出现问题)。如果你在范围请求中访问bean,则将为每个请求生成一个新实例。Spring为你管理此事务,但你必须小心并为bean使用正确的作用域。通常,你的控制器是单例,但AppModel必须是作用域request,否则你将有两个同时请求的问题。

关于你的最后一个问题“魔术是如何发生的?”,答案是“方面/代理”。Spring创建代理类。你可以想象Spring将为你的AppModel类创建一个代理。一旦你尝试在控制器中访问它,Spring就会将方法调用转发到正确的实例。



 类似资料:
  • 我是JPA的新手,有一个关于如何处理实体的问题。在我的例子中,我有3个实体:用户、组和事件。 一个事件总是属于一个组。这意味着有一个OneToMulti-Relation。一个用户可以订阅多个组,这意味着有一个ManyToMulti-Relation。现在我遇到麻烦的部分。一个用户也可以订阅多个事件,这意味着也有一个ManyToMulti-Relation。 现在我的问题是。我如何在我的组实体中列

  • 在我的项目中,我使用slf4j和logback作为后端日志记录框架,但是有很多依赖项使用log4j作为日志记录框架,所以发现slf4j有多个绑定,我该如何处理呢?如果我排除了不想要的slf4j-log4j依赖项,框架或库本身会正确地处理日志记录吗?

  • 但我得到了NullPointerException任何人都可以帮忙

  • 我必须在Spring批处理作业中实现以下用例: 通过读取提供程序列表 遍历列表,并为步骤1中找到的每个提供程序(作为输入参数)调用另一个。 第二个SP的输出将写入CSV。 我提出了以下策略: 第1步开始 SP ItemReader返回提供程序列表。 在ItemWriter中,将提供程序保存到 步骤1结束 第2步开始 另一个SP项目读取器从访问提供程序 另一个ItemWriter使用FlatFile

  • 问题内容: 我的一个朋友要我实现一个蓝色和红色指针来代表两只单独的鼠标的输入,以加快用于实时音频混合的混合台场景。我很乐意,但是尽管我认为这是个好主意,但我不知道从哪里开始寻找可能的解决方案。 我应该从哪里开始研究实现双鼠标输入的可行方法? 问题答案: 看一下jinput。 我已经使用了多个键盘,几乎可以肯定它也支持多个鼠标。

  • 问题内容: 我需要更新或删除几个文档。 当我更新时,我这样做: 我首先搜索文档,为返回的结果设置更大的限制(比方说,大小:10000)。 对于每个返回的文档,我都会修改某些值。 我不喜欢对整个修改后的清单(批量索引)进行Elasticsearch。 该操作一直进行到点1不再返回结果为止。 当我删除时,我这样做: 我首先搜索文档,为返回结果设置更大的限制(例如,大小:10000) 我删除所有找到的发