您的位置:首页 > 其它

火箭作业系统知识总结

2015-07-17 15:04 232 查看
1.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;

}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: