火箭作业系统知识总结
2015-07-17 15:04
232 查看
1.Spring设计模式-单例模式:
单例模式也属于创建型模式,所谓单例,顾名思义,所指的就是单个实例,也就是说要保证一个类仅有一个实例。
单例模式有以下的特点:
①单例类只能有一个实例
②单例类必须自己创建自己的唯一实例
③单例类必须给所有其他对象提供这一实例
饿汉
懒汉
单例注册表
当我们试图从Spring容器中取得某个类的实例时,默认情况下,Spring会采用单例模式进行创建。
<bean id="date" class="java.util.Date"/>
<bean id="date" class="java.util.Date" scope="singleton"/> (仅为Spring2.0支持)
<bean id="date" class="java.util.Date" singleton="true"/>
以上三种创建对象的方式是完全相同的,容器都会向客户返回Date类的单例引用。那么如果我不想使用默认的单例模式,每次请求我都希望获得一个新的对象怎么办呢?很简单,将scope属性值设置为prototype(原型)就可以了
<bean id="date" class="java.util.Date" scope="prototype"/>
通过以上配置信息,Spring就会每次给客户端返回一个新的对象实例。
Spring源码既采用单例注册表的形式:
单例模式也属于创建型模式,所谓单例,顾名思义,所指的就是单个实例,也就是说要保证一个类仅有一个实例。
单例模式有以下的特点:
①单例类只能有一个实例
②单例类必须自己创建自己的唯一实例
③单例类必须给所有其他对象提供这一实例
饿汉
Public class Singleton1{ Private static final Singleton1 instance=new Singleton1(); //私有的默认构造函数 Private Singleton1(){} //静态工厂方法 Public static Singleton1 getInstance(){ Return instance; } }
懒汉
Public class Singleton2{ Private static final Singleton2 instance=null; //私有的默认构造函数 Public Singleton1(){} //静态工厂方法 Public synchronized static Singleton2 getInstance(){ If(instance==null){ Instance=new Singleton2(); } Return instance; } }
单例注册表
Import java.util.HashMap; Public class RegSingleton{ Static private HashMap registry=new HashMap(); //静态块,在类被加载时自动执行 Static{ RegSingleton rs=new RegSingleton(); Registry.put(rs.getClass().getName(),rs); } //受保护的默认构造函数,如果为继承关系,则可以调用,克服了单例类不能为继承的缺点 Protected RegSingleton(){} //静态工厂方法,返回此类的唯一实例 public static RegSingleton getInstance(String name){ if(name==null){ name=” RegSingleton”; } if(registry.get(name)==null){ try{ registry.put(name,Class.forName(name).newInstance()); } Catch(Exception ex){ex.printStackTrace();} } Return (RegSingleton)registry.get(name); } }
当我们试图从Spring容器中取得某个类的实例时,默认情况下,Spring会采用单例模式进行创建。
<bean id="date" class="java.util.Date"/>
<bean id="date" class="java.util.Date" scope="singleton"/> (仅为Spring2.0支持)
<bean id="date" class="java.util.Date" singleton="true"/>
以上三种创建对象的方式是完全相同的,容器都会向客户返回Date类的单例引用。那么如果我不想使用默认的单例模式,每次请求我都希望获得一个新的对象怎么办呢?很简单,将scope属性值设置为prototype(原型)就可以了
<bean id="date" class="java.util.Date" scope="prototype"/>
通过以上配置信息,Spring就会每次给客户端返回一个新的对象实例。
Spring源码既采用单例注册表的形式:
public abstract class AbstractBeanFactory implements ConfigurableBeanFactory{ /** * 充当了Bean实例的缓存,实现方式和单例注册表相同 */ private final Map singletonCache=new HashMap(); public Object getBean(String name)throws BeansException{ return getBean(name,null,null); } ... public Object getBean(String name,Class requiredType,Object[] args)throws BeansException{ //对传入的Bean name稍做处理,防止传入的Bean name名有非法字符(或则做转码) String beanName=transformedBeanName(name); Object bean=null; //手工检测单例注册表 Object sharedInstance=null; //使用了代码锁定同步块,原理和同步方法相似,但是这种写法效率更高 synchronized(this.singletonCache){ sharedInstance=this.singletonCache.get(beanName); } if(sharedInstance!=null){ ... //返回合适的缓存Bean实例 bean=getObjectForSharedInstance(name,sharedInstance); }else{ ... //取得Bean的定义 RootBeanDefinition mergedBeanDefinition=getMergedBeanDefinition(beanName,false); ... //根据Bean定义判断,此判断依据通常来自于组件配置文件的单例属性开关 //<bean id="date" class="java.util.Date" scope="singleton"/> //如果是单例,做如下处理 if(mergedBeanDefinition.isSingleton()){ synchronized(this.singletonCache){ //再次检测单例注册表 sharedInstance=this.singletonCache.get(beanName); if(sharedInstance==null){ ... try { //真正创建Bean实例 sharedInstance=createBean(beanName,mergedBeanDefinition,args); //向单例注册表注册Bean实例 addSingleton(beanName,sharedInstance); } catch (Exception ex) { ... } finally{ ... } } } bean=getObjectForSharedInstance(name,sharedInstance); } //如果是非单例,即prototpye,每次都要新创建一个Bean实例 //<bean id="date" class="java.util.Date" scope="prototype"/> else{ bean=createBean(beanName,mergedBeanDefinition,args); } } ... return bean; } }
相关文章推荐
- 杂记
- 教程-Delphi7设置功能表
- Linux环境下Python的安装过程
- Remove Event Handler via Reflection
- Ducci Sequence
- actionbar使用
- startActivityForResult() 中requestCode 和 resultCode 的作用
- 【facebook】程序猿提高工作效率的15点技巧
- MiniTwitter记住密码等功能实现
- thinkphp autoload 命名空间自定义 namespace
- linux kernel scheduler -- 进程优先级
- Linux常用C函数-字符测试篇
- 几点看法:关于“优衣库”
- Facebook、微信和陌陌,一起来看看社交应用的商业化尝试
- Android 自定义 ViewPager 打造千变万化的图片切换效果
- http和socket之长连接和短连接区别
- 微信、陌陌等著名IM软件设计架构详解
- 教程-FastReport 的安装 心得
- Java数据结构和算法的数组
- (剑指Offer)面试题26:复杂链表的复制