一个bean的Spring会话范围究竟如何? Web上下文中bean的默认范围是什么?

时间:2015-04-02 12:42:43

标签: java spring spring-mvc

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

  1. 会话范围的目的究竟是什么?
  2. 阅读文档我知道这可以将bean定义范围扩展到HTTP会话。仅在Web感知Spring ApplicationContext的上下文中有效。此外,每个用户会话都会创建一个新实例。

    但究竟是什么时候使用的?为了什么目的?你能举一个实际的例子吗?

    1. 在Spring MVC中,Web上下文中的默认范围是什么?
    2. 我知道在Spring中,bean的默认范围是 singleton ,但是在Web上下文中bean的范围呢?

5 个答案:

答案 0 :(得分:12)

  1. 对于有状态的bean使用spring会话bean,并且每个用户的状态不同。这些可以是当前登录用户的首选项。
  2. spring中bean的默认范围是singleton,在Web Application上下文中没有区别。
  3. 注意,在Web环境中,您还可以使用REQUEST作用域bean,它们的生命周期仅限于一个用户请求。当不需要会话且请求足够时,您应该使用请求范围。

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

答案 1 :(得分:11)

Ans 1)会话范围与HttpSession范围非常相似。基于会话范围范围实例化的Bean通过HTTP会话生效。与请求范围类似,它仅适用于Web感知弹簧应用程序上下文。

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

然后

@Inject
private ShopCart cart;

Ans 2)默认值是Singleton无处不在。

答案 2 :(得分:9)

实际上Spring帮助您创建Session范围bean而不是传统方式

httpSession.setAttribute("Object",new Object());
&&
httpSession.getAttribute("Object");

和Spring提供了这种有效的方法

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

现在,使用Factory Pattern

创建和销毁此关联会话对象是一件令人头疼的问题

答案 3 :(得分:5)

我遇到了同样的问题,我正在使用:

@Component
@Scope("session")

这为我带来了魔力:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 

我希望它有所帮助; - )

答案 4 :(得分:0)

  

但是什么时候使用它呢?出于什么目的?你能做一个   实际的例子吗?

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

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

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

Yasir Shabbir Choudhary的回答指出了其他有趣的部分,您可以使用传统方式来模仿相同的行为。

Is Spring session scoped bean saved in HttpSession?

您的第二个问题已经得到许多默认范围的回答- Singleton 在这里也适用。