spring:使用会话和请求作用域
在Web应用中,如果能够实例化在会话和请求范围内共享的bean,那将是非常有价值的事情。例如,在典型的电子商务应用中,可能会有一个bean代表用户的购物车。如果购物车是单例的话,那么将会导致所有的用户都会向同一个购物车中添加商品。另一方面,如果购物车是原型作用域的,那么在应用中某一个地方往购物车中添加商品,在应用的另外一个地方可能就不可用了,因为在这里注入的是另外一个原型作用域的购物车。
就购物车bean来说,会话作用域是最为合适的,因为它与给定的用户关联性最大。要指定会话作用域,我们可以使用@Scope注解,它的使用方式与指定原型作用域是相同的:
@Componet
@Scope(
value=webApplicationContext.SCOPE_SESSION,
proxyModel=ScopeProxyModel.INTERFACES
)
public ShoppingCart cart{......}
这里,我们将value设置成了WebApplicationContext中的SCOPE_SESSION常量(它的值是session)。这会告诉Spring为Web应用中的每个会话创建一个ShoppingCart。这会创建多个ShoppingCart bean的实例,但是对于给定的会话只会创建一个实例,在当前会话相关的操作中,这个bean实际上相当于单例的。
要注意的是,@Scope同时还有一个proxyMode属性,它被设置成了ScopedProxyMode.INTERFACES。这个属性解决了将会话或请求作用域的bean注入到单例bean中所遇到的问题。在描述proxyMode属性之前,我们先来看一下proxyMode所解决问题的场景。
假设我们要将ShoppingCart bean注入到单例StoreService bean的Setter方法中,如下所示:
@Componet
public class StoreService{
@Autowired
public void setShoppingCart(ShoppingCart shoppingCart)
{
this.shoppingCart = shoppingCart;
}
}
因为StoreService是一个单例的bean,会在Spring应用上下文加载的时候创建。当它创建的时候,Spring会试图将ShoppingCart bean注入到setShoppingCart()方法中。但是ShoppingCart bean是会话作用域的,此时并不存在。直到某个用户进入系统,创建了会话之后,才会出现ShoppingCart实例。
另外,系统中将会有多个ShoppingCart实例:每个用户一个。我们并不想让Spring注入某个固定的ShoppingCart实例到StoreService中。我们希望的是当StoreService处理购物车功能时,它所使用的ShoppingCart实例恰好是当前会话所对应的那一个。Spring并不会将实际的ShoppingCart bean注入到StoreService中,Spring会注入一个到ShoppingCart bean的代理,如图3.1所示。这个代理会暴露与ShoppingCart相同的方法,所以StoreService会认为它就是一个购物车。但是,当StoreService调用ShoppingCart的方法时,代理会对其进行懒解析并将调用委托给会话作用域内真正的ShoppingCart bean。
现在,我们带着对这个作用域的理解,讨论一下proxyMode属性。如配置所示,proxyMode属性被设置成了ScopedProxyMode.INTERFACES,这表明这个代理要实现ShoppingCart接口,并将调用委托给实现bean。
如果ShoppingCart是接口而不是类的话,这是可以的(也是最为理想的代理模式)。但如果ShoppingCart是一个具体的类的话,Spring就没有办法创建基于接口的代理了。此时,它必须使用CGLib来生成基于类的代理。所以,如果bean类型是具体类的话,我们必须
要将proxyMode属性设置为ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标类扩展的方式创建代理。
尽管我主要关注了会话作用域,但是请求作用域的bean会面临相同的装配问题。因此,请求作用域的bean应该也以作用域代理的方式进行注入。
转载于:https://www.cnblogs.com/achengmu/p/8302622.html
spring:使用会话和请求作用域相关推荐
- spring 事务 会话_测试Spring的“会话”范围
spring 事务 会话 在基于Spring的Web应用程序中,bean的作用域可以是用户"会话". 从本质上讲,这意味着对会话范围Bean的状态更改仅在用户会话范围内可见. 本条 ...
- cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean
cdi 2.7.5 在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内 ...
- j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围
j2ee 和 j2se 我们目前正在考虑重构Naked Objects框架,以使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我 ...
- 测试Spring的“会话”范围
在基于Spring的Web应用程序中,bean的作用域可以是用户"会话". 从本质上讲,这意味着对会话范围的Bean的状态更改仅在用户会话范围内可见. 此项的目的是简单地突出显示S ...
- 集成测试CDI 1.0和Spring 3.1中的作用域bean
在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内的bean,例如Us ...
- 在J2SE应用程序中模拟CDI的会话和请求范围
我们目前正在考虑将Naked Objects框架重构为使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我们想利用JSR-299中 ...
- Spring容器中Bean的作用域
当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...
- Spring MVC会话教程
会话管理是每个Web应用程序必不可少的部分. 由于Spring MVC是用于Web开发的功能强大的框架,因此它具有自己的工具和API与会话进行交互. 今天,我打算向您展示Spring MVC应用程序中 ...
- REST + Spring Security会话问题
REST , 会话 ..等待. REST应用程序中没有会话,对吗? 好吧,那是真的. 如果我们可以避免会议,我们应该这样做. REST是无状态的 . 有关无状态性的主要问题是身份验证. 在通常的Web ...
最新文章
- 为什么linux中c语言不一样,不懂linux为什么要死守c语言。
- lcd取模如何取16位_两种方式实现取16位变量的高低8位, 不严谨对比
- Apache POI学习笔记
- 前端-----小米商城模块练习
- 湖南大学高级软件开发过程
- php防撞库,基于单片机的倒车防撞预警系统设计和实现
- PTES渗透测试执行标准
- 笔记本计算机摄像头怎么打开,笔记本电脑的摄像头在哪里打开(图解摄像头开启步骤)...
- 为什么有斯坦福计算机科学博士学位的你找不到工作?
- php 跨站脚本攻击漏洞,PHP跨站脚本攻击(XSS)漏洞修复思路(二)
- mac pro 系统升级带来的问题
- VS2015支持UTF-8 with BOM编码格式处理中文、西班牙文、法文等非英文字符
- 程序员学c语言吗,为什么程序员要学C语言
- iOS 一个错误 Unable to find a specification for
- [SRv6]《SRv6网络编程》SRv6网络在电信云中的应用
- vsm什么意思_VSM通用图标和基本概念解释.ppt
- Xbox One的Unity在这里!
- Java 浅拷贝、深拷贝,你知多少?
- QQ飞行棋点数控制器V1.1 Cracked.exe
- 闰年是指年份能整除4且不能整除100的(如2004年就是闰年,1901年不是闰年);或者年份能整除400的是闰年(如2000年是闰年,1900年不是闰年)。