首页 > 代码库 > 【第三章】 DI 之 3.4 Bean的作用域(捌)

【第三章】 DI 之 3.4 Bean的作用域(捌)

3.4  Bean的作用域

       什么是作用域呢?即“scope”,在面向对象程序设计中一般指对象或变量之间的可见范围。而在Spring容器中是指其创建的Bean对象相对于其他Bean对象的请求可见范围。

Spring提供“singleton”和“prototype”两种基本作用域,另外提供“request”、“session”、“global session”三种web作用域;Spring还允许用户定制自己的作用域。

3.4.1  基本的作用域

       一、singleton指“singleton”作用域的Bean只会在每个Spring IoC容器中存在一个实例,而且其完整生命周期完全由Spring容器管理。对于所有获取该Bean的操作Spring容器将只返回同一个Bean。

GoF单例设计模式指“保证一个类仅有一个实例,并提供一个访问它的全局访问点”,介绍了两种实现:通过在类上定义静态属性保持该实例和通过注册表方式。

1)通过在类上定义静态属性保持该实例:一般指一个Java虚拟机 ClassLoader装载的类只有一个实例,一般通过类静态属性保持该实例,这样就造成需要单例的类都需要按照单例设计模式进行编码;Spring没采用这种方式,因为该方式属于侵入式设计;代码样例如下:

package cn.javass.spring.chapter3.bean;  
public class Singleton {  
    //1.私有化构造器  
    private Singleton() {}  
    //2.单例缓存者,惰性初始化,第一次使用时初始化  
    private static class InstanceHolder {  
        private static final Singleton INSTANCE = new Singleton();  
    }  
    //3.提供全局访问点  
    public static Singleton getInstance() {  
        return InstanceHolder.INSTANCE;  
    }  
    //4.提供一个计数器来验证一个ClassLoader一个实例  
    private int counter=0;  
}  

以上定义个了个单例类,首先要私有化类构造器;其次使用InstanceHolder静态内部类持有单例对象,这样可以得到惰性初始化好处;最后提供全局访问点getInstance,使得需要该单例实例的对象能获取到;我们在此还提供了一个counter计数器来验证一个ClassLoader一个实例。具体一个ClassLoader有一个单例实例测试请参考代码“cn.javass.spring.chapter3. SingletonTest”中的“testSingleton”测试方法,里边详细演示了一个ClassLoader有一个单例实例。

【第三章】 DI 之 3.4 Bean的作用域(捌)