Spring MVC如何处理多个用户

时间:2013-06-21 12:56:11

标签: spring spring-mvc

我使用超过6个月的春天。我无法理解与下面情景相关的这种潜在机制。

我有一个春季网络应用程序。现在我在控制器中自动启动了模型。基于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秒发送请求,那么第一个客户端请求是否会被覆盖?

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

由于

1 个答案:

答案 0 :(得分:30)

每个网络请求都会生成一个新帖子explained in this thread

Spring管理不同的范围(原型,请求,会话,单例)。如果两个并发请求访问单个bean,则bean必须是无状态的(或至少同步以避免出现问题)。如果在范围请求中访问bean,则将为每个请求生成一个新实例。 Spring为您管理这个,但您必须小心并使用正确的bean范围。通常,您的控制器是单例,但AppModel必须是范围request,否则您将遇到两个同时发出请求的问题。 This thread could also help you

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