笔记5 bean的作用域
1. Spring定义了多种作用域,可以基于这些作用域创建bean,包括:
- 单例(Singleton):在整个应用中,只创建bean的一个实例。(默认)
 - 原型(Prototype):每次注入或者通过Spring应用上下文获取的 时候,都会创建一个新的bean实例。
 
<1>如果使用组件扫描来发现和声明bean,那么可以在bean的 类上使用@Scope注解,将其声明为原型bean:
@Scope(ConfigurableBeanFactory.SCOPE_PROTOTYPE )或者@Scope("prototype")
<2>如果想在Java配置中声明原型bean,那么可以组合使 用@Scope和@Bean来指定所需的作用域。
<3>如果使用XML来配置bean的话,可以使用<bean>元素的 scope属性来设置作用域
- 会话(Session):在Web应用中,为每个会话创建一个bean实例。
 - 请求(Request): 在Web应用中,为每个请求创建一个bean实例。
 
购物车bean设置为会话作用域,使用@Scope注解:@Scope(value=WebApplicationContext.SCOPE_SESSION,proxyMode=ScopedProxyMode.INTERFACES)
电子商务应用中,当用户进入系统后,创建了相应的会话后,购物车实例才会产生,而且系统中会有多个购物车的实例,每个用户一个。系统中还有一个专门处理购物车的实例StoreService(将购物车对象传入,然后进行处理),它是一个单例的bean,会在Spring应用上下文加载的时候创建。这时会产生一个问题,当创建这个StoreServices时,Spring会试图将购物车bean注入到StoreService中,但此时购物车bean是会话作用域的,此时并不存在。所以,期望是当StoreService处理购物车功能时,它所使用的购物车实例恰好时当前会话所对应的那一个。Spring并不会将实际的购物车bean注入到StoreService中, Spring会注入一个到购物车 bean的代理,。这个代理会暴露与购物车bean相同的方法,所以StoreService 会认为它就是一个购物车。但是,当StoreService调 用购物车的方法时,代理会对其进行懒解析并将调用委托 给会话作用域内真正的购物车 bean。
proxyMode属性被设置成了 ScopedProxyMode.INTERFACES,这表明这个代理要实现 购物车的接口,并将调用委托给实现bean。如果购物车类是接口而不是类的话,这是可以的(也是最为 理想的代理模式)。但如果购物车类是一个具体的类的话, Spring就没有办法创建基于接口的代理了。此时,它必须使用CGLib 来生成基于类的代理。所以,如果bean类型是具体类的话,我们必须要将proxyMode属性设置为ScopedProxyMode.TARGET_CLASS,以此来表明要以生成目标 类扩展的方式创建代理。
请求作用域的bean应该也以作用域代理的方式进行注入。
如果需要使用XML来声明会话或请求作用域的bean,那么就不能使 用@Scope注解及其proxyMode属性了,要使用<aop:scoped-proxy>。

<aop:scoped-proxy>是与@Scope注解的proxyMode属性功能相 同的Spring XML配置元素。它会告诉Spring为bean创建一个作用域代理。默认情况下,它会使用CGLib创建目标类的代理。但是我们也可 以将proxy-target-class属性设置为false,进而要求它生成基 于接口的代理:
<为了使用<aop:scoped-proxy>元素,我们必须在XML配置中声明 Spring的aop命名空间>


笔记5 bean的作用域的更多相关文章
- [原创]java WEB学习笔记99:Spring学习---Spring Bean配置:自动装配,配置bean之间的关系(继承/依赖),bean的作用域(singleton,prototype,web环境作用域),使用外部属性文件
		
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
 - Spring4学习笔记 - 配置Bean - 自动装配 关系 作用域 引用外部属性文件
		
1 Autowire自动装配 1.1 使用:只需在<bean>中使用autowire元素 <bean id="student" class="com.k ...
 - Spring 学习笔记 Bean的作用域
		
在配置文件中定义Bean时,用户不但可以配置Bean的属性值以及相互之间的依赖关系,还可以定义Bean的作用域.作用域将对Bean的生命周期和创建方式产生影响.在低版本的Spring中,仅有两个作用域 ...
 - 吴裕雄--天生自然JAVA SPRING框架开发学习笔记:Spring中Bean的作用域
		
作用域的种类 Spring 容器在初始化一个 Bean 的实例时,同时会指定该实例的作用域.Spring3 为 Bean 定义了五种作用域,具体如下. 1)singleton 单例模式,使用 sing ...
 - 浅析Spring中bean的作用域
		
一.前言 刚刚花了点时间,阅读了一下Spring官方文档中,关于bean的作用域这一块的内容.Spring-4.3.21官方文档中,共介绍了七种bean作用域,这篇博客就来简单介绍一下这七种作用域 ...
 - Spring中Bean的作用域、生命周期
		
Bean的作用域.生命周期 Bean的作用域 Spring 3中为Bean定义了5中作用域,分别为singleton(单例).protot ...
 - Spring bean的作用域和生命周期
		
bean的作用域 1.singleton,prototype, web环境下:request,session,gloab session 2.通过scope="" 来进行配置 3. ...
 - Bean 的作用域
		
•在 Spring 中, 可以在 <bean> 元素的 scope 属性里设置 Bean 的作用域. 默认情况下, Spring 只为每个在 IOC 容器里声明的 Bean 创建唯一一个实 ...
 - Spring学习笔记—装配Bean
		
在Spring中,对象无需自己负责查找或创建与其关联的其他对象.相反,容器负责把需要相互协作的对象引用赋予各个对象.创建应用对象之间协作关系的行为通常称为装配(wiring),这也是依赖注入的本质. ...
 
随机推荐
- MSSQL 2000 错误823恢复
			
一.故障描述 MSSQL Server 2000 附加数据库错误823,附加数据库失败.数据库没有备份,不能通过备份恢复数据库,急需恢复数据库中的数据. 二.故障分析SQL Server数据库 823 ...
 - 工频相位无线同步模块PSYN5000系列在高压设备状态检测和局部放电故障定位的应用方案
			
关键词: PSYN5000,无线同步模块,工频相位,局部放电,在线监测,高压设备,设备状态,故障定位. 前言: 在电力监测领域,出于方便和安全考虑,有些系统不得不采用无线通信的方式,在这样一个无线通信 ...
 - Python内置函数(3)——max
			
英文文档: max(iterable, *[, key, default]) max(arg1, arg2, *args[, key]) Return the largest item in an i ...
 - 粒子系统(二):Canvas绘制精美图案
			
准备 IDE:Visual Studio Code Language:JavaScript / ECMAScript 6+ GitHub:Natural2D.JS 本文主要讲述 Particles - ...
 - 启动mongodb遇到的错:warning: 32-bit servers don't have journaling enabled by deflity
			
执行修复:mongod --repair即可 正常关闭:killall mongod
 - Java并发编程:synchronized和锁优化
			
1. 使用方法 synchronized 是 java 中最常用的保证线程安全的方式,synchronized 的作用主要有三方面: 确保线程互斥的访问代码块,同一时刻只有一个方法可以进入到临界区 保 ...
 - python Flask
			
python Flask Flask是一个基于Python开发并且依赖jinja2模板和Werkzeug WSGI服务的一个微型框架,对于Werkzeug本质是Socket服务端,其用于接收http请 ...
 - 如何使用Visual Studio 2017自带的源代码反编译功能
			
反编译C#源代码,大家可能第一时间想到 .NET Reflector 这个工具.但是这个工具反编译出来的代码跟实际源码还是有一定差距的,阅读起来不是很便利. 本人在查看Visual Studio 20 ...
 - spark2.1操作json(save/read)
			
建筑物配置信息: case class BuildingConfig(buildingid: String, building_height: Long, gridcount: Long, gis_d ...
 - Java:逐行读、写文件、文件目录过滤的用法
			
import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.I ...