码迷,mamicode.com
首页 > 其他好文 > 详细

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

时间:2016-10-24 11:30:44      阅读:126      评论:0      收藏:0      [点我收藏+]

标签:静态属性   return   hold   第三章   缓存   介绍   turn   instance   操作   

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的作用域(捌)

标签:静态属性   return   hold   第三章   缓存   介绍   turn   instance   操作   

原文地址:http://www.cnblogs.com/ClassNotFoundException/p/5992262.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!