spring bean 范围及单例模式的实现
Spring Bean 的scope=“singleton/prototype/session”属性
singleton:
SpringIoc容器只会创建该Bean的唯一实例,所有的请求和引用都只使用这个实例
prototype:每次请求都创建一个实例 request: 在一次Http请求中,容器会返回该Bean的同一个实例,而对于不同的用户请求,会返回不同的实例。需要注意的是,该作用域仅在基于Web的Spring ApplicationContext情形下有效,以下的session和global Session也是如此
session:同上,唯一的区别是请求的作用域变为了session
global session:
全局的HttpSession中,容器会返回该bean的同一个实例,典型为在是使用portlet context的时候有效
注意:只要多线程能成功获取单例(即多线程获得的单例实例是相同的),必然能共享单例的状态package pattern.singleton;
// 1.饿汉式单例类(在类初始化时,就已经实例化)
public class Singleton1 {
// 私有的构造函数
private Singleton1(){}
// 自行实例化
private static final Singleton1 singleton = new Singleton1();
// 公共工厂方法
public static Singleton1 getInstance(){
return singleton;
}
}
package pattern.singleton;
//2.懒汉式单例类(在第一次调用的时候实例化)
public class Singleton2 {
// 私有的构造函数
private Singleton2(){};
// 对象定义
private static Singleton2 singleton;
// 公共的静态同步方法
public synchronized static Singleton2 getInstance() {
if(singleton==null){
singleton = new Singleton2();
}
return singleton;
}
}