【发布时间】:2015-02-03 07:08:00
【问题描述】:
当我们部署一个 Spring Web 应用程序时。网络服务器如何处理多个用户对 Spring 中定义的同一个 bean 的请求?如果是单例 bean,是否只为多个用户请求创建一个 bean? 多个用户的请求如何使用单个 WAR 文件?
【问题讨论】:
当我们部署一个 Spring Web 应用程序时。网络服务器如何处理多个用户对 Spring 中定义的同一个 bean 的请求?如果是单例 bean,是否只为多个用户请求创建一个 bean? 多个用户的请求如何使用单个 WAR 文件?
【问题讨论】:
我从一些堆栈中引用了以前的问题.. :)
Spring 中的 Singleton bean 和 Singleton 模式是完全不同的。单例模式表示每个类加载器只会创建一个特定类的一个实例。
Spring 单例的范围被描述为每个容器每个 bean。它是每个 Spring IoC 容器对单个对象实例的 bean 定义范围。 Singleton 中 Spring 中的默认作用域。
虽然默认作用域是单例,但是你可以通过指定元素的scope属性来改变bean的作用域。
每个网络请求都会生成一个新线程,如该线程中所述。
Spring 管理不同的范围(原型、请求、会话、单例)。如果两个同时请求访问一个单例 bean,则该 bean 必须是无状态的(或至少同步以避免问题)。如果您访问范围请求中的 bean,则每个请求都会生成一个新实例。 Spring 为您管理这个,但您必须小心并为您的 bean 使用正确的范围。通常,您的控制器是单例,但 AppModel 必须是范围请求,否则您将遇到两个同时请求的问题。这个帖子也可以帮助你。
关于您的最后一个问题“这个魔法是如何发生的?”,答案是“方面/代理”。 Spring 创建代理类。你可以想象 Spring 会为你的 AppModel 类创建一个代理。只要您尝试在控制器中访问它,Spring 就会将方法调用转发到正确的实例。
【讨论】: