当前位置: 首页 > 知识库问答 >
问题:

Spring范围行为与单个和多个Web请求/会话

颜君浩
2023-03-14

每当我试图分析以了解Spring范围时,我都被困在某个地方。以下是我分析后的理解,在总结之前,我想和你确认一下。如果我的理解有误,请纠正我。

<bean id="signupController" class="com.crp.controller.SignupController"
        scope="">

如果范围是“请求”,则对于来自客户端的每个新请求,无论会话如何,spring 容器都将生成新实例。一旦请求完成,Spring容器将设法关闭实例的生命周期。

如果范围是“会话”,则对于会话的第一个请求,Spring 容器将生成一个新实例,并为该特定会话的所有客户端请求维护它。一旦会话超时,Spring容器将设法关闭实例的生命周期。

如果scope是“prototype ”,那么无论会话如何,只要bean被请求,spring container就会生成新的实例。开发人员应该管理实例的生命周期,因为spring容器不会管理原型范围的生命周期。

如果作用域是“singleton”,那么spring container只生成一个实例,并保持它对所有请求都可用,而不管会话。对于每个会话,将维护一个singleton实例的副本,以便一个会话singleton对象不会被另一个会话共享,并且spring container将管理singleton实例副本的生命周期,并在会话超时时关闭它。

注意:我相信你们中的大多数人在我对单例范围的理解上可能有不同的看法。即使我也对单例示波器的行为感到困惑,并在分析过程中获得不同的信息。请分享您的想法

谢谢。

对于单例作用域,容器的工作原理如下,实现多个用户(会话)同时发送请求。

登录.java:

public class Login {
    private String username;
    private String password;

    public String getUsername() {
    return username;
    }

    public void setUsername(String username) {
    this.username = username;
    }

    public String getPassword() {
    return password;
    }

    public void setPassword(String password) {
    this.password = password;
    }
}

登录控制器.java:

public class LoginController extends MultiActionController {

    private Login login;

    public ModelAndView submitLogin(HttpServletRequest request,
        HttpServletResponse response) {
    String userName = request.getParameter("username");
    String password= request.getParameter("password");
    getLogin().setUserName(userName);
    getLogin().setPassword(password);
    // TODO send login bean to DAO for executing further business logic.
    }

    public Login getLogin() {
    return login;
    }

    public void setLogin(Login login) {
    this.login = login;
    }
}

上下文.xml:

<bean id="login" class="com.crp.bean.Login" scope="singleton">
</bean>

<bean id="loginController" class="com.crp.controller.LoginController" scope="singleton">
        <property name="login" ref="login"></property>
</bean>

共有1个答案

东方海
2023-03-14

不,那不完全正确。

如果作用域是“请求”,则对于来自客户端的每个新请求,无论会话如何,spring容器都将生成一个新实例。

不。只有当代码调用bean上的方法(即在包装实际bean实例的作用域代理上)时,才会创建bean实例。但您是对的,每个请求都有一个不同于其他请求的bean实例,并且bean在请求结束时被销毁(即其生命周期挂钩(如果存在)在请求结束时被调用)。

如果范围是“会话”,那么对于会话的第一个请求,Spring容器将生成一个新实例,并为该特定会话的所有客户端请求维护它。

与请求范围相同的注释:bean实例是按需创建的。

如果作用域是“原型”,则无论会话如何,只要请求bean,spring容器都将生成新实例。

右。但请注意,您需要向 Spring 上下文请求一个 Bean 实例才能获得一个新实例。如果您将原型注入单例豆,则单例豆子将在其整个生命周期中保持对该豆的引用,因此每次单例豆子调用它时都将使用相同的原型豆。

如果作用域是“singleton”,那么spring container只生成一个实例,并保持它对所有请求都可用,而不管会话。对于每个会话,将维护一个singleton实例的副本,以便一个会话singleton对象不会被另一个会话共享,并且spring container将管理singleton实例副本的生命周期,并在会话超时时关闭它。

不。这是完全错误的。根本不会复制任何内容。单个实例被创建,在任何地方注入,并在任何地方并发使用。仅当应用程序本身结束时,Bean 才会被销毁。

 类似资料:
  • 我使用spring指南中简单REST服务的纯示例代码作为基础:http://spring.io/guides/gs/rest-service/ 我添加了单个Bean配置: 然后,我修改后的控制器如下所示: 而我正在得到 由于呼叫“/问候” 我在这里读了一些描述:http://docs.spring.io/spring/docs/current/spring-framework-reference/

  • 我想在我的web应用程序中使用Spring事件与我的bean“说话”。 例如,fired事件的bean如下所示: 所以,我的问题是: 事件侦听器是作用域请求是否可能?而如何做到这一点呢? 谢谢

  • 在请求范围中,bean被定义为HTTP请求,而在会话范围中,bean被定义为HTTP会话。例如, 如果bean范围是请求,并且用户在其用户会话中对网页发出多个请求,则在每个请求上都会创建一个新bean。 而如果范围被定义为bean的会话,如果用户多次请求网页,则在每次请求时都会返回相同的bean。 请让我知道这种理解是否正确?

  • 我们知道Spring框架提供了单例、原型、请求、会话、全局会话bean范围。 我们还知道Spring Web流提供了flow Scope、viewScope、Request estScope、flash Scope、versationScope。 因此,如果我在spring MVC项目中提到一个组件,比如说Student,作为@Component@Scope=singleton。对于每个请求,它会

  • 从WebSocketendpoint,我尝试调用单例服务。但是我无法使用来自WebSocket的请求或会话范围。 谢谢你的帮助!

  • 在大容量(每秒约50,000个请求)的java Web应用程序中,我使用Threadloce-app执行一个任务,该任务应按请求范围执行。 我可以使用Spring请求范围实现相同的效果,我想知道哪种性能更好? 在代码中,使用线程本地: 对于每个超文本传输协议请求设置: 使用Spring请求范围: 现在,什么成本更高: 或 不知道有没有人已经尝试过这样的标杆了呢?