Spring的IOC容器—scope作用域

Scope 简介:

Scope用来声明容器中的对象的存货时间。即容器在对象在进入其相应的scope之前,生成并装配这些对象,在该对象不再处于这些scope的限定之后,容器通常会销毁这些对象。

Sprign容器最初提供了两种bean的scope类型:singletoon和prototype。自Spring2.0之后,引入了另外三种scope类型,即request、session和global session类型。这三种类型只能再web中使用。


1.Singleton

代表在Spring的IOC容器中只存在一个实例,所有对象引用共享该实例。 该实例从容器启动,并因第一次请求而初始化之后,将一直存活到容器中。与IOC容器共生共灭。


Spring的IOC容器—scope作用域_第1张图片


注意:Singleton作用域与Singleton模式的区别

标记Singleton的bean代表这种类型的bean在容器中只存在一个共享实例,而Singleton模式则是保证在同一个classloader中只存在一个这种类型的实例。


Singleton 特性:

A. 对象实例数量:容器中只存在一个实例,所有对该类型bean的依赖都引用这单一实例。

B. 对象存活时间:从容器启动,到第一次因请求而实例化开始,只要容器不销毁或退出,该实例一直存在。


配置形式




2. prototype  

容器在接到标有prototype类型对象的请求后,会每次重新生成一个新的对象实例给请求方。请求方负责当前返回对象的后继生命周期工作,包括对象的销毁。

一般声明此类型的bean都是一些有状态的。比如保存每个顾客信息的对象。


Spring的IOC容器—scope作用域_第2张图片

配置形式

         singleton="false"/>
         scope="prototype"/>

 

3. requestsessiionglobal session
它们只适用于Web应用程序,通常是与XmlWebApplicationContext共同使用

.request

配置形式:scope="request"/>

Spring容器,即XmlWebApplicationConteext会为每个Http请求创建一个新的requestProcessor对象供当前对象使用,当请求结束后,该对象实例的生命周期即告结束。当同时有10Http请求进来,容器会分别为这10个请求返回10个全新的实例,且它们之间互不干扰。


.session   

 配置形式: scope="session"/>

Spring容器会为每个独立的session创建属于它们自己的全新的userManager对象实例。存活时间大于request


.global session

配置形式: scope="globalSession"/>

global session只有应用在基于portletWeb应用程序中才有意义,它映射到portletglobal范围的 session。如果在普通的基于servletWeb应用中使用了这个类型的scope,容器会将其作为普通的session
类型的scope对待。

 

4.自定义scope类型

用户可以根据自己的需要,添加自定义的scope类型。除了默认的singletonprototype之外,其他三种类型,包括自定义类型都实现了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个方法并非都是必须的,但getremove方法必须实现。


你可能感兴趣的