Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/372.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java bean的Spring会话范围究竟是如何工作的?web上下文中bean的默认作用域是什么?_Java_Spring_Spring Mvc - Fatal编程技术网

Java bean的Spring会话范围究竟是如何工作的?web上下文中bean的默认作用域是什么?

Java bean的Spring会话范围究竟是如何工作的?web上下文中bean的默认作用域是什么?,java,spring,spring-mvc,Java,Spring,Spring Mvc,我正在学习Spring MVC,我有以下疑问: 会话范围的具体目的是什么? 阅读文档后,我知道这将bean定义的范围限定为HTTP会话。仅在支持web的Spring应用程序上下文的上下文中有效。并且每个用户会话创建一个新实例 但具体什么时候使用?为什么呢?你能举个实际的例子吗 在Spring MVC中,web上下文中的默认作用域是什么? 我知道在春季,bean的默认作用域是singleton,但是在web上下文中bean的作用域呢 对于有状态的bean,您可以使用spring会话bean,每个用

我正在学习Spring MVC,我有以下疑问:

  • 会话范围的具体目的是什么?
  • 阅读文档后,我知道这将bean定义的范围限定为HTTP会话。仅在支持web的Spring应用程序上下文的上下文中有效。并且每个用户会话创建一个新实例

    但具体什么时候使用?为什么呢?你能举个实际的例子吗

  • 在Spring MVC中,web上下文中的默认作用域是什么?
  • 我知道在春季,bean的默认作用域是singleton,但是在web上下文中bean的作用域呢

  • 对于有状态的bean,您可以使用spring会话bean,每个用户的状态不同。例如,这些可以是当前登录用户的首选项
  • spring中bean的默认作用域是singleton,在Web应用程序上下文中也一样
  • 注意,在web环境中,您还可以使用请求范围的bean,它们的生存期仅为每个用户请求。当会话不必要且请求足够时,应该使用请求作用域

    此外,在portlet环境中,您可以使用另一个作用域,即全局会话。每个portlet都有自己的独立会话,通常这些portlet只为自己封装自己的状态。但是,如果需要在不同的portlet之间共享会话数据,则需要使用全局会话作用域。

    Ans 1)会话作用域与HttpSession作用域非常相似。基于会话作用域实例化的bean通过HTTP会话存在。与请求范围类似,它仅适用于支持web的spring应用程序上下文

    /** * Annotation-based configuration of session scope */ 
    @Component
    @Scope("session") 
    public class ShopCart { }
    
    然后

    @Inject
    private ShopCart cart;
    

    Ans 2)默认值为到处都是单例。

    实际上,Spring帮助您创建会话范围bean,而不是传统的方法

    httpSession.setAttribute("Object",new Object());
    &&
    httpSession.getAttribute("Object");
    
    Spring提供了这种有效的方法

    @Component
    @Scope("session")
    public class Foo{
    }
    

    现在,使用Factory模式创建和销毁这个关联的会话对象是spring最头疼的事情了。我也遇到了同样的问题,我使用了:

    @Component
    @Scope("session")
    
    这让我变魔术了:

    @Component
    @Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
    
    我希望有帮助;-)

    但具体什么时候使用?为什么呢?你能做一个简单的决定吗 实例

    在我的一个基于JSP的Spring MVC web应用程序中,我们使用它来存储用户在会话中的第一个请求后不会发生变化的数据,即当用户第一次来到服务器时,我们填充这个bean的字段,然后在后续请求(会话中的下一个请求)中使用(aka read)这些值,例如,用户名用户组织组地址登录客户号

    这些常量值是强制性的&在所有日志消息或所有SQL查询中都需要

    请求路由的设计方式是,bean填充(bean属性的设置)在每个会话中只发生一次

    Yasir Shabbir Choudhary的回答中指出的另一个有趣的部分是,你们可以用传统的方式模仿相同的行为


    许多人已经回答了您的第二个问题,默认范围--单例在这里也适用

    听起来你好像知道答案。将bean注入web上下文不会改变其默认范围。将bean限定到会话是存储与特定用户会话相关的状态的简便方法。最后,每个会话只有一个实例。下面是一个示例,我使用它为每个用户实例化了一个长时间运行的Drools会话:@Steve Tnx,但如果我真的知道答案,我不会问它。最多我能对可能发生的事情有一个想法,但我完全不确定,因为我正在研究它,我没有经验