有人寫文章用深入淺出或者通俗易懂來(lái)形容自己的文章,此時(shí)我這里一見如故再好不過(guò)了 ^_^
一見如故?
大多數(shù)java開發(fā)者,對(duì)于spring真的是不能在熟悉了,每次你的tomcat在啟動(dòng)后是不是會(huì)看見好多個(gè)singleton的字眼,好多開發(fā)者不會(huì)太在意這些東西,可是越深入越得知道這些基礎(chǔ)的東西。在spring所有的bean缺省的生成方式是singleton,也就是說(shuō)你所有的bean在你不指定scope的情況下都會(huì)是singleton(單例模式) 與之對(duì)應(yīng)的原型模式我會(huì)在下次為大家說(shuō)明。
spring-bean4.xsd源文件.png
來(lái)一個(gè)實(shí)際中的場(chǎng)景 這里我將redis連接池使用了單例模式,哈哈默認(rèn)也是單例只不過(guò)為了表述清楚而已
bean.png
這樣的場(chǎng)景,你會(huì)一見如故嗎?
^^
常見的兩種單例模式
餓漢式與懶漢式
實(shí)現(xiàn)單例,先私有化類的構(gòu)造器,這是就不會(huì)被實(shí)例化了
所謂餓漢式單例模式 看下面代碼
//餓漢式 啟動(dòng)時(shí)就加載了實(shí)例
public class Singlet {
private Singlet(){
}
//直接實(shí)例化了該對(duì)象,別人用時(shí)直接通過(guò)類名調(diào)用getInstance()
//這樣就實(shí)現(xiàn)了餓漢式,管你需不需要直接通過(guò)getInstance()得到
private final static Singlet singlet = new Singlet();
//獲取該類
public static Singlet getInstance(){
return singlet;
}
}
提到懶漢式單例模式 不能不一見如故了 又得引用spring bean了 嘿嘿
image.png
接著看下spring-bean.xsd lazy-init的說(shuō)明 默認(rèn)不開啟懶漢模式的 在spring中如果你開啟了懶漢模式 以為著只有你使用這個(gè)bean時(shí)才會(huì)被初始化
image.png
直接看代碼 探探究竟
//懶漢式 當(dāng)有訪問(wèn)時(shí)才加載實(shí)例
public class Singlet2 {
private Singlet2(){
}
//這里類變量初始空引用
private static Singlet2 singlet2 = null;
//調(diào)用此方式時(shí)有個(gè)邏輯判斷 有實(shí)例則直接返回類變量 沒(méi)有則實(shí)例化該類 真正實(shí)現(xiàn)了懶加載
public static Singlet2 getSinglet2(){
//進(jìn)行的這步內(nèi)容會(huì)發(fā)生線程安全問(wèn)題 并發(fā)情境下 故不考慮
/* if(singlet2==null){
singlet2 = new Singlet2();
}*/
if(singlet2 == null){
synchronized (Singlet2.class){
singlet2 = new Singlet2();
}
}
return singlet2;
}
}
一見如故,我是FirmJack