是否在HttpSession中保存了Spring会话范围的bean?

时间:2012-02-12 20:54:24

标签: java spring servlets inversion-of-control httpsession

由于我没有深入了解spring会话范围的实现。 任何人都可以告诉我,使用Spring Session scoped bean是否明智,其中HttpSession对象非常重要。就像一个Web应用程序,成千上万的用户同时访问该站点。

Spring会话范围bean是否保存在HttpSession对象中?

或者即使HttpSession对象仅引用spring会话范围的bean,我们不会使会话对象变重吗?

如何直接在HttpSession对象中存储任何bean(使HttpSession对象重视)?

3 个答案:

答案 0 :(得分:2)

该对象实际上并未存储在HTTP会话中。它与会话ID链接,并实际存储在Spring上下文中。会话关闭后,会话侦听器用于清理实例。请参阅SessionScope JavaDoc。

答案 1 :(得分:1)

以下是Spring文档所说的内容:

  

将单个bean定义范围限定为HTTP会话的生命周期。   仅在Web感知Spring ApplicationContext的上下文中有效。

“重”?不比你放入它的物体重。会话应该有一个有限的生命周期。每个会话几千字节不会是您的应用程序的结束。对同时会话数和对象内存要求的简单计算应该让您放心应用服务器内存设置。如果需要,您可以随时增加最小和最大内存。

无论你是不是Spring bean,在HTTP会话中存储都是一样的。 bean工厂只是做了一些额外的事情来帮助你管理对象的生命周期。

答案 2 :(得分:0)

是否在HttpSession对象中保存了spring会话范围的bean?

如果你在这里提到的HttpSession对象实际上是由spring-session提供的(spring-session将httpSession对象包装在原始的httpRequest中),那么答案将是YES - >实际上,所有spring会话作用域bean都保存在spring-session提供的httpSession中作为属性。

或者即使HttpSession对象仅引用spring会话范围的bean,我们不会使会话对象变重吗?

没有。 httpSession的“沉重感”很大程度上取决于你输入的对象。此外,会话bean也是短暂的。最后但并非最不重要的一点是,微服务世界中的会话对象通常会卸载到独立商店,如Redis或HazelCast。因此,就内存消耗而言,它不会被视为“重”。

如何直接在HttpSession对象中存储任何bean(使HttpSession对象重视)?

没有任何区别(假设您正在使用spring-sesion),因为所有Spring会话范围的bean都保存在spring-session提供的httpSession中作为属性。