在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:使用会话和请求作用域相关推荐

  1. spring 事务 会话_测试Spring的“会话”范围

    spring 事务 会话 在基于Spring的Web应用程序中,bean的作用域可以是用户"会话". 从本质上讲,这意味着对会话范围Bean的状态更改仅在用户会话范围内可见. 本条 ...

  2. cdi 2.7.5_集成测试CDI 1.0和Spring 3.1中的作用域bean

    cdi 2.7.5 在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内 ...

  3. j2ee 和 j2se_在J2SE应用中模拟CDI的会话和请求范围

    j2ee 和 j2se 我们目前正在考虑重构Naked Objects框架,以使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我 ...

  4. 测试Spring的“会话”范围

    在基于Spring的Web应用程序中,bean的作用域可以是用户"会话". 从本质上讲,这意味着对会话范围的Bean的状态更改仅在用户会话范围内可见. 此项的目的是简单地突出显示S ...

  5. 集成测试CDI 1.0和Spring 3.1中的作用域bean

    在这篇博客文章中,我描述了如何在Spring和CDI中使用作用域bean进行集成测试. 一切都用小代码示例进行说明. 使用范围进行集成测试并不是特别容易. 想象一下存在于会话范围内的bean,例如Us ...

  6. 在J2SE应用程序中模拟CDI的会话和请求范围

    我们目前正在考虑将Naked Objects框架重构为使用JSR-330(依赖注入)和面向EE的老大哥JSR-299(CDI). 使用香草JSR-330是不费吹灰之力的,但是我们想利用JSR-299中 ...

  7. Spring容器中Bean的作用域

    当通过Spring容器创建一个Bean实例时,不仅可以完成Bean实例的实例化,还可以为Bean指定特定的作用域.Spring支持如下5种作用域: singleton:单例模式,在整个Spring I ...

  8. Spring MVC会话教程

    会话管理是每个Web应用程序必不可少的部分. 由于Spring MVC是用于Web开发的功能强大的框架,因此它具有自己的工具和API与会话进行交互. 今天,我打算向您展示Spring MVC应用程序中 ...

  9. REST + Spring Security会话问题

    REST , 会话 ..等待. REST应用程序中没有会话,对吗? 好吧,那是真的. 如果我们可以避免会议,我们应该这样做. REST是无状态的 . 有关无状态性的主要问题是身份验证. 在通常的Web ...

最新文章

  1. 为什么linux中c语言不一样,不懂linux为什么要死守c语言。
  2. lcd取模如何取16位_两种方式实现取16位变量的高低8位, 不严谨对比
  3. Apache POI学习笔记
  4. 前端-----小米商城模块练习
  5. 湖南大学高级软件开发过程
  6. php防撞库,基于单片机的倒车防撞预警系统设计和实现
  7. PTES渗透测试执行标准
  8. 笔记本计算机摄像头怎么打开,笔记本电脑的摄像头在哪里打开(图解摄像头开启步骤)...
  9. 为什么有斯坦福计算机科学博士学位的你找不到工作?
  10. php 跨站脚本攻击漏洞,PHP跨站脚本攻击(XSS)漏洞修复思路(二)
  11. mac pro 系统升级带来的问题
  12. VS2015支持UTF-8 with BOM编码格式处理中文、西班牙文、法文等非英文字符
  13. 程序员学c语言吗,为什么程序员要学C语言
  14. iOS 一个错误 Unable to find a specification for
  15. [SRv6]《SRv6网络编程》SRv6网络在电信云中的应用
  16. vsm什么意思_VSM通用图标和基本概念解释.ppt
  17. Xbox One的Unity在这里!
  18. Java 浅拷贝、深拷贝,你知多少?
  19. QQ飞行棋点数控制器V1.1 Cracked.exe
  20. 闰年是指年份能整除4且不能整除100的(如2004年就是闰年,1901年不是闰年);或者年份能整除400的是闰年(如2000年是闰年,1900年不是闰年)。

热门文章

  1. Qt6程序打包(如何解决Qt程序在其他电脑上无法运行的问题)
  2. 哪些事情瞬间暴露了你的贫穷?
  3. 普通二本院校的讲师可以不做科研吗?
  4. 你怎么看待中国石油上市以来的表现?
  5. 学会放松,是通向生命觉‮的醒‬必经之路
  6. 今天跟某个投了社区团购的资本合伙人聊,发现对于社区团购的认知,还是太肤浅
  7. 支付宝相关信息会被泄露出去吗?
  8. 魅族智能识屏怎么用才算是高科技?
  9. 部分公务员已领数字货币工资,数字货币或年内扩大试点,支付宝、微信支付还会有优势吗?
  10. Visual Studio Code(VS Code)入门