spring Bean的五种scope

转载 2016年05月30日 09:49:30

scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。打个比方吧!我们都是处在社会(容器)中,如果把中学教师作为一个类定义,那么当容器初始化这些类之后,中学教师只能局限在中学这个场景中,中学,就可以看做中学教师的scope。

Spring容器最初提供了两种bean的scope类型:singleton和prototype,但发布2.0之后,又引入了另外三种scope类型,即request,session和global session类型。不过这三种类型有所限制,只能在web应用中使用,也就是说,只有在支持web应用的ApplicationContext中使用这三个scope才是合理的。

可以使用bean的singleton或scope属性来指定相应对象的scope,其中,scope属性只能在XSD格式的文档生命中使用,类似于如下代码所演示的形式:

DTD:

<bean id ="mockObject1" class="..." singleton="false" />

XSD:

<bean id ="mockObject1" class="..."   scope="prototype" />

注意:这里的singleton和设计模式里面的单例模式不一样,标记为singleton的bean是由容器来保证这种类型的bean在同一个容器内只存在一个共享实例,而单例模式则是保证在同一个Classloader中只存在一个这种类型的实例。

1. singleton

singleton类型的bean定义,在一个容器中只存在一个实例,所有对该类型bean的依赖都引用这一单一实例,这就好像每个幼儿园都会有一个滑梯一样,这个幼儿园的小朋友共同使用这一个滑梯,而对于幼儿园容器来说,滑梯就是一个singleton的bean。

此外,singleton类型的bean定义,从容器启动,到他第一次被请求而实例化开始,只要容器不销毁或退出,该类型的bean的单一实例就会一直存活。

通常情况下,如果你不指定bean的scope,singleton便是容器默认的scope,所以,下面三种配置,形式实际上达成的是同样的效果:

DTD or XSD:

<bean id ="mockObject1" class="..." />

DTD:

<bean id ="mockObject1" class="..." singleton="true" />

XSD:

<bean id ="mockObject1" class="..."   scope="singleton" />

2 prototype

scope为prototype的bean,容器在接受到该类型的对象的请求的时候,会每次都重新生成一个新的对象给请求方,虽然这种类型的对象的实例化以及属性设置等工作都是由容器负责的,但是只要准备完毕,并且对象实例返回给请求方之后,容器就不在拥有当前对象的引用,请求方需要自己负责当前对象后继生命周期的管理工作,包括该对象的销毁。也就是说,容器每次返回请求方该对象的一个新的实例之后,就由这个对象“自生自灭”了。

让我们继续幼儿园的比喻,我们今天要分苹果了!将苹果的bean的scope属性声明为prototype,在每个小朋友领取苹果的时候,我们都是发一个新的苹果给他,发完之后,小朋友爱怎么吃就怎么吃,爱什么时候吃什么时候吃,但是注意吃完要把果核扔到垃圾箱哦!对于那些不能共享使用的对象类型,应该将其定义的scope设为prototype,通常,声明为prototype的的bean,都是一些有状态的,比如保存为每个顾客信息的对象。

可以用一下方式定义prototype类型的bean:

DTD:

<bean id ="mockObject1" class="..." singleton="false" />

XSD:

<bean id ="mockObject1" class="..."   scope="prototype" />

3 request ,session和global session

这三个类型是spring2.0之后新增的,他们不像singleton和prototype那么通用,因为他们只适用于web程序,通常是和XmlWebApplicationContext共同使用,将在第6章详细讨论,这里简单介绍。

request:

<bean id ="requestPrecessor" class="...RequestPrecessor"   scope="request" />

Spring容器,即XmlWebApplicationContext 会为每个HTTP请求创建一个全新的RequestPrecessor对象,当请求结束后,,该对象的生命周期即告结束。当同时有10个HTTP请求进来的时候,容器会分别针对这10个请求创建10个全新的RequestPrecessor实例,且他们相互之间互不干扰,从不是很严格的意义上说,request可以看做prototype的一种特例,除了场景更加具体之外,语意上差不多。

session:

对于web应用来说,放到session中最普遍的就是用户的登录信息,对于这种放到session中的信息,我们我们可以使用如下形式的制定scope为session:

<bean id ="userPreferences" class="...UserPreferences"   scope="session" />

Spring容器会为每个独立的session创建属于自己的全新的UserPreferences实例,他比request scope的bean会存活更长的时间,其他的方面真是没什么区别。

global session:

<bean id ="userPreferences" class="...UserPreferences"   scope="globalsession" />

global session只有应用在基于porlet的web应用程序中才有意义,他映射到porlet的global范围的session,如果普通的servlet的web 应用中使用了这个scope,容器会把它作为普通的session的scope对待

可分为状态Bean和无状态Bean

pring还支持一种自定义scope类型

Spring基础:快速入门spring(11):bean scope注解方式

在前面我们已经学习过spring中的bean scope, 温故而知新,这次我们将使用注解的方式来验证singleton和prototype的区别。...
  • liumiaocn
  • liumiaocn
  • 2016年12月02日 07:20
  • 1448

Spring中Bean的5种作用域scope

Bean简介:     在Spring中,那些组成你应用程序的主体(backbone)及由Spring IoC容器所管理的对象,被称之为bean。 简单地讲,bean就是由Spring容器初始化、装配...
  • haojiahj
  • haojiahj
  • 2014年02月28日 13:48
  • 1855

Spring - IOC创建对象的时机,创建Bean的Scope 及其 IOC的 生命周期

一. Spring容器创建Bean的Scope     spring容器创建bean的scope : 验证创建的对象是单例的还是多例的? 1. 由spring产生的bean默认是单例的; 2. 在sp...
  • LABLENET
  • LABLENET
  • 2015年12月25日 17:04
  • 1617

Spring中的scope配置和@scope注解

Scope,也称作用域,在 Spring IoC 容器是指其创建的 Bean 对象相对于其他 Bean 对象的请求可见范围。在 Spring IoC 容器中具有以下几种作用域:基本作用域(reques...
  • Tracycater
  • Tracycater
  • 2017年01月04日 14:43
  • 5216

Spring框架bean的scope属性

scope属性默认的是singleton,单例的意思,但是如果spring整合struts2的时候,scope属性的值应该设置成scope="prototype",意思是非单例的意思。 单例的设计模...
  • Tidhy
  • Tidhy
  • 2017年06月05日 23:38
  • 259

Spring Bean 的scope什么时候设置为prototype,什么时候设置为singleton

Java代码   "testAction" class = "com.kewen.xxxAction" scope = "prototype"/>   Spring Bea...
  • q276513307
  • q276513307
  • 2017年10月30日 15:33
  • 158

Spring scope属性详解

摘自《Spring 解密》 scope用来声明IOC容器中的对象应该处的限定场景或者说该对象的存活空间,即在IOC容器在 对象进入相应的scope之前,生成并装配这些对象,在该对象不再处于这些s...
  • smile_from_2015
  • smile_from_2015
  • 2016年04月27日 11:05
  • 1619

spring中的scope详解

0.思维导图 1. scope概论 spring中scope是一个非常关键的概念,简单说就是对象在spring容器(IOC容器)中的生命周期,也可以理解为对象在spring容器中的创建方式。 2...
  • weinabanta
  • weinabanta
  • 2014年10月16日 22:40
  • 24323

spring--bean的作用域

在默认的情况下,Spring应用上下文中所有的bean都是单例模式. 但是有时候,我们并不希望我们的bean是单例的,所以,spring提供了多种作用于,包括: 1. 单例(Singl...
  • xingtingshu
  • xingtingshu
  • 2016年08月22日 16:51
  • 460

不同作用域(scope)的Spring Bean之间的依赖关系的动态代理注入

Spring Bean可能具有不同的作用域(Scope),相同域的Spring Bean之间互相依赖基本没有问题。 但是不同域的Spring Bean之间互相依赖,如果不做特殊定义,则只能在实例化Sp...
  • taiyangdao
  • taiyangdao
  • 2016年03月25日 09:12
  • 1297
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring Bean的五种scope
举报原因:
原因补充:

(最多只允许输入30个字)