我使用 Spring 已有 6 个多月了。我无法理解与以下场景相关的底层机制。
我有一个 Spring Web 应用程序。现在我在控制器中自动连接了模型。根据 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 秒内发送请求,那么第一个客户端的请求会被覆盖吗?
我想我越来越困惑了。有人能解释一下这个魔法是如何发生的吗?
Thanks
每个网络请求都会生成一个新线程在这个线程中解释了 https://stackoverflow.com/questions/7457190/how-threads-allocated-to-handle-servlet-request.
Spring管理不同的范围(原型、请求、会话、单例)。如果两个同时请求访问一个单例 bean,则该 bean 必须是无状态的(或者至少是同步的以避免出现问题)。如果您在请求范围内访问 bean,则每个请求都会生成一个新实例。 Spring 为您管理这个,但是您必须小心并为您的 bean 使用正确的范围。通常,您的控制器是单例的,但AppModel
必须在范围内request
,否则两个同时请求将会出现问题。这个线程也可以帮助你 https://stackoverflow.com/questions/11139571/scope-of-a-spring-controller-and-its-instance-variables.
关于你的最后一个问题“这个魔法是如何发生的?”,答案是“方面/代理”。 Spring创建代理类。你可以想象 Spring 会创建一个代理到你的AppModel
班级。一旦您尝试在控制器中访问它,Spring 就会将方法调用转发给right实例。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)