我正在学习Spring MVC,我有以下疑问:
阅读文档我知道这可以将bean定义范围扩展到HTTP会话。仅在Web感知Spring ApplicationContext的上下文中有效。此外,每个用户会话创建一个新实例。
但究竟是什么时候使用?为了什么目的?你能做一个实际的例子吗?
我知道在Spring中,bean的默认范围是单例,但是在Web上下文中bean的范围又如何呢?
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无处不在。
请注意,在Web环境中,您还可以使用REQUEST作用域bean,它们的生命周期仅限于一个用户请求。当不需要会话且请求足够时,您应该使用请求范围。
此外,在portlet环境中,您可以使用另一个作为GLOBAL SESSION的作用域。每个portlet都有自己的独立会话,通常这些portlet都是优先的,只能为自己封装自己的状态。但是,如果需要在不同的portlet之间共享会话数据,则需要使用全局会话范围。
实际上Spring帮助您创建Session范围bean而不是传统方式
httpSession.setAttribute("Object",new Object());
&&
httpSession.getAttribute("Object");
和Spring提供这种有效的方式
@Component
@Scope("session")
public class Foo{
}
现在,使用Factory Pattern创建和销毁这个关联的会话对象是一件令人头痛的问题
我遇到了同样的问题,我正在使用:
@Component
@Scope("session")
这为我带来了魔力:
@Component
@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)
我希望它有所帮助;-)
但究竟是什么时候使用?为了什么目的?你能做一个实际的例子吗?
在我的一个基于JSP的Spring MVC Web应用程序中,我们使用它来存储在用户第一次请求之后不会改变的数据,即当用户第一次访问服务器时我们填充该bean的字段然后我们使用(也就是读取)后续请求中的这些值(会话中的下一个请求),例如用户名,用户组织组,地址,登录客户端号等。
这些常量值在所有日志消息或所有SQL查询中都是必需的。
请求路由的设计方式是每个会话只发生一次bean填充(bean属性的设置)。
正如Yasir Shabbir Choudhary所说,其他有趣的部分可以使用传统方式模仿相同的行为。
Is Spring session scoped bean saved in HttpSession?
许多人已经回答了你的第二个问题,即默认范围 - Singleton也适用于此。