我使用超过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秒发送请求,那么第一个客户端请求是否会被覆盖?
我觉得我很困惑。有人可以澄清这种魔法是如何发生的吗?
由于
答案 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 实例。