Scope 简介:
Scope用来声明容器中的对象的存货时间。即容器在对象在进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。
Sprign容器最初提供了两种bean的scope类型:singletoon和prototype。自Spring2.0之后,引入了另外三种scope类型,即request、session和global session类型。这三种类型只能再web中使用。
1.Singleton
代表在Spring的IOC容器中只存在一个实例,所有对象引用共享该实例。 该实例从容器启动,并因第一次请求而初始化之后,将一直存活到容器中。与IOC容器共生共灭。
注意:Singleton作用域与Singleton模式的区别
标记Singleton的bean代表这种类型的bean在容器中只存在一个共享实例,而Singleton模式则是保证在同一个classloader中只存在一个这种类型的实例。
Singleton 特性:
A. 对象实例数量:容器中只存在一个实例,所有对该类型bean的依赖都引用这单一实例。
B. 对象存活时间:从容器启动,到第一次因请求而实例化开始,只要容器不销毁或退出,该实例一直存在。
配置形式:
<bean id="mockObject1"class="...MockBusinessObject"/>
<beanid="mockObject1" class="...MockBusinessObject"singleton="true"/>
<bean id="mockObject1" class="...MockBusinessObject"scope="singleton"/>
2. prototype
容器在接到标有prototype类型对象的请求后,会每次重新生成一个新的对象实例给请求方。请求方负责当前返回对象的后继生命周期工作,包括对象的销毁。
一般声明此类型的bean都是一些有状态的。比如保存每个顾客信息的对象。
配置形式:
<bean id="mockObject1" class="...MockBusinessObject"singleton="false"/>
<bean id="mockObject1" class="...MockBusinessObject" scope="prototype"/>
3. request、sessiion和global session
它们只适用于Web应用程序,通常是与XmlWebApplicationContext共同使用
.request
配置形式:<bean id="userManager"class="... "scope="request"/>
Spring容器,即XmlWebApplicationConteext会为每个Http请求创建一个新的requestProcessor对象供当前对象使用,当请求结束后,该对象实例的生命周期即告结束。当同时有10个Http请求进来,容器会分别为这10个请求返回10个全新的实例,且它们之间互不干扰。
.session
配置形式: <bean id="userManager"class="...userManager "scope="session"/>
Spring容器会为每个独立的session创建属于它们自己的全新的userManager对象实例。存活时间大于request。
.global session
配置形式: <bean id="userManager" class="...userManager"scope="globalSession"/>
global session只有应用在基于portlet的Web应用程序中才有意义,它映射到portlet的global范围的 session。如果在普通的基于servlet的Web应用中使用了这个类型的scope,容器会将其作为普通的session
类型的scope对待。
4.自定义scope类型
用户可以根据自己的需要,添加自定义的scope类型。除了默认的singleton和prototype之外,其他三种类型,包括自定义类型都实现了org.springframework.beans.factory.config.Scope接口。该接口定义如下:
public interface Scope {
Object get(String name, ObjectFactory objectFactory);
Object remove(String name);
void registerDestructionCallback(String name, Runnable callback);
String getConversationId();
}
要实现自己的scope类型,首先需要给出一个Scope接口的实现类,接口定义中的4个方法并非都是必须的,但get和remove方法必须实现。