有人写文章用深入浅出或者通俗易懂来形容自己的文章,此时我这里一见如故再好不过了 ^_^
一见如故?
大多数java开发者,对于spring真的是不能在熟悉了,每次你的tomcat在启动后是不是会看见好多个singleton的字眼,好多开发者不会太在意这些东西,可是越深入越得知道这些基础的东西。在spring所有的bean缺省的生成方式是singleton,也就是说你所有的bean在你不指定scope的情况下都会是singleton(单例模式) 与之对应的原型模式我会在下次为大家说明。
来一个实际中的场景 这里我将redis连接池使用了单例模式,哈哈默认也是单例只不过为了表述清楚而已
这样的场景,你会一见如故吗?
^^
常见的两种单例模式
饿汉式与懒汉式
实现单例,先私有化类的构造器,这是就不会被实例化了
所谓饿汉式单例模式 看下面代码
//饿汉式 启动时就加载了实例
public class Singlet {
private Singlet(){
}
//直接实例化了该对象,别人用时直接通过类名调用getInstance()
//这样就实现了饿汉式,管你需不需要直接通过getInstance()得到
private final static Singlet singlet = new Singlet();
//获取该类
public static Singlet getInstance(){
return singlet;
}
}
提到懒汉式单例模式 不能不一见如故了 又得引用spring bean了 嘿嘿
接着看下spring-bean.xsd lazy-init的说明 默认不开启懒汉模式的 在spring中如果你开启了懒汉模式 以为着只有你使用这个bean时才会被初始化
直接看代码 探探究竟
//懒汉式 当有访问时才加载实例
public class Singlet2 {
private Singlet2(){
}
//这里类变量初始空引用
private static Singlet2 singlet2 = null;
//调用此方式时有个逻辑判断 有实例则直接返回类变量 没有则实例化该类 真正实现了懒加载
public static Singlet2 getSinglet2(){
//进行的这步内容会发生线程安全问题 并发情境下 故不考虑
/* if(singlet2==null){
singlet2 = new Singlet2();
}*/
if(singlet2 == null){
synchronized (Singlet2.class){
singlet2 = new Singlet2();
}
}
return singlet2;
}
}
一见如故,我是FirmJack