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

And*_*ili 17 java spring spring-mvc

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

  1. 会话范围的目的究竟是什么?

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

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

  1. 在Spring MVC中,Web上下文中的默认范围是什么?

我知道在Spring中,bean的默认范围是单例,但是在Web上下文中bean的范围又如何呢?

Voj*_*cka 13

  1. 对于有状态的bean使用spring会话bean,并且每个用户的状态不同.这些可以是例如当前登录用户的偏好.
  2. spring中bean的默认范围是singleton,在Web Application上下文中没有区别.

请注意,在Web环境中,您还可以使用REQUEST作用域bean,它们的生命周期仅限于一个用户请求.当不需要会话且请求足够时,您应该使用请求范围.

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


小智 12

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

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

然后

@Inject
private ShopCart cart;
Run Code Online (Sandbox Code Playgroud)

Ans 2)默认是Singleton无处不在.


Yas*_*ary 10

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

httpSession.setAttribute("Object",new Object());
&&
httpSession.getAttribute("Object");
Run Code Online (Sandbox Code Playgroud)

和Spring提供这种有效的方式

@Component
@Scope("session")
public class Foo{
}
Run Code Online (Sandbox Code Playgroud)

现在,使用Factory Pattern创建和销毁这个关联的会话对象是一个令人头痛的问题


Rob*_*uez 6

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

@Component
@Scope("session")
Run Code Online (Sandbox Code Playgroud)

这为我带来了魔力:

@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS) 
Run Code Online (Sandbox Code Playgroud)

我希望它有所帮助;-)