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

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

荀俊迈
2023-03-14

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

  1. 会话范围的目的到底是什么

阅读文档后,我知道这将bean定义的范围限定为HTTP会话。仅在支持web的Spring ApplicationContext上下文中有效。而且每个用户会话都会创建一个新实例。

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

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

共有3个答案

缑兴贤
2023-03-14

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

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

Spring提供了这种有效的方法

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

现在使用工厂模式创建和销毁这个关联的会话对象是令人头疼的事情

濮阳霄
2023-03-14
  1. 您将Spring会话bean用于有状态且每个用户的状态不同的bean。例如,这些可以是当前登录用户的首选项。
  2. bean在Spring中的默认范围是单例,在Web应用程序上下文中没有什么不同。

注意,在web环境中,您还可以使用请求范围的bean,它们的生存期仅为每个用户请求。当会话不必要且请求足够时,应该使用请求范围。

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

龙晟睿
2023-03-14

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)默认值为Singleton everywhere。

 类似资料:
  • 问题内容: 我正在研究Spring MVC,但有以下疑问: 会话范围的目的到底是什么? 阅读文档,我知道这将bean定义的范围限定为HTTP会话。仅在可感知网络的Spring ApplicationContext上下文中有效。而且,每个用户会话一次创建一个新实例。 但是什么时候才使用呢?出于什么目的?你能举一个实际的例子吗? 在Spring MVC中,Web上下文的默认范围是什么? 我知道在Spr

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

  • 问题内容: 有人可以解释一下我一直只使用“原型”的Spring bean的作用域吗,但是还有其他参数可以代替吗? 我在说什么的例子 问题答案: 从Spring规范开始,支持五种类型的bean作用域: 1.单身人士(默认*) 每个Spring IoC容器将单个bean定义的作用域限定为单个对象实例。 2.原型 将单个bean定义的作用域限定为任意数量的对象实例。 3.要求 将单个bean定义的范围限

  • 通常,默认范围是请求范围。我曾尝试删除范围注释,并希望bean具有请求bean作用域行为(通过在前一页返回提交的值,我记得我过去曾尝试过,效果很好),但我没有得到与之相关的表达式语言。那么默认范围是什么,为什么不是相同的行为?!

  • 问题内容: 考虑以下请求范围的CDI bean: 现在,我将其注入到应用程序范围的bean中: 我运行了这段代码,并注意到两个请求之间的请求范围的Bean实例是不同的,但应用程序范围的Bean实例是相同的。我的疑问是:这如何运作?在每个请求时,是否将请求范围的Bean实例重新分配给应用程序范围的字段?还是应用程序范围的bean的代理只是在请求之间改变? 问题答案: 在CDI中,每个注入的对象实际上

  • 问题内容: 我有一个User类: 和一个控制器类: 我使会话无效,以便下次我进入/ users时,我得到另一个用户。由于用户的会话范围,我期望使用其他用户,但是我得到的是同一用户。我在调试模式下进行了检查,它与内存中的对象ID是相同的。我的bean声明为: 我是春季新手,所以我显然做错了什么。我希望每个会话有一个User实例。怎么样? 问题答案: 这是预期的行为。当标记带有代理的bean时,将为其