常用開(kāi)源框架中設(shè)計(jì)模式使用分析-單例設(shè)計(jì)模式(Singleton Pattern)

四懂诗、單例設(shè)計(jì)模式(Singleton Pattern)

4.1 介紹

阿里巴巴長(zhǎng)期招聘Java研發(fā)工程師p6,p7,p8等上不封頂級(jí)別殃恒,有意向的可以發(fā)簡(jiǎn)歷給我,注明想去的部門(mén)和工作地點(diǎn):1064454834@qq.com

歡迎關(guān)注微信公眾號(hào):技術(shù)原始積累 獲取更多技術(shù)干貨

單例模式是一種創(chuàng)建型模式离唐,單例模式提供一個(gè)創(chuàng)建對(duì)象的接口,但是多次調(diào)用該接口返回的是同一個(gè)實(shí)例的引用亥鬓,目的是為了保證只有一個(gè)實(shí)例域庇,并且提供一個(gè)訪(fǎng)問(wèn)這個(gè)實(shí)例的統(tǒng)一接口。

4.2 Spring中單例bean的創(chuàng)建

Spring中默認(rèn)配置的bean的scope為singleton熟呛,也就是單例作用域惰拱。那么看看它是如何做到的。
在AbstractBeanFactory類(lèi)里面的doGetBean方法:

protected Object doGetBean(
            final String name, final Class requiredType, final Object[] args, boolean typeCheckOnly) throws BeansException {

    final String beanName = transformedBeanName(name);
    Object bean = null;

    // 解決set循環(huán)依賴(lài)
    Object sharedInstance = getSingleton(beanName);
    if (sharedInstance != null && args == null) {
        ...
    }

    else {
        ...
        // 創(chuàng)建單件bean.
        if (mbd.isSingleton()) {
            sharedInstance = getSingleton(beanName, new ObjectFactory() {
                public Object getObject() throws BeansException {
                    try {
                        return createBean(beanName, mbd, args);
                    }
                    catch (BeansException ex) {
                    ...
                        throw ex;
                    }
                }
            });
            bean = getObjectForBeanInstance(sharedInstance, name, beanName, mbd);
        }
       //創(chuàng)建原型bean
        else if (mbd.isPrototype()) {
            ...
        }
        //創(chuàng)建request作用域bean
        else {
            ...
        }
    }
            ...
    return bean;
}

getSingleton代碼:

public Object getSingleton(String beanName, ObjectFactory singletonFactory) {
    Assert.notNull(beanName, "'beanName' must not be null");
    synchronized (this.singletonObjects) {
        Object singletonObject = this.singletonObjects.get(beanName);
        if (singletonObject == null) {
            ...
            beforeSingletonCreation(beanName);
            ...
            try {
                singletonObject = singletonFactory.getObject();
            }
            catch (BeanCreationException ex) {
                ...
            }
            finally {
                if (recordSuppressedExceptions) {
                    this.suppressedExceptions = null;
                }
                afterSingletonCreation(beanName);
            }
            addSingleton(beanName, singletonObject);
        }
        return (singletonObject != NULL_OBJECT ? singletonObject : null);
    }
}

protected void addSingleton(String beanName, Object singletonObject) {
    synchronized (this.singletonObjects) {
        this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
        this.singletonFactories.remove(beanName);
        this.earlySingletonObjects.remove(beanName);
        this.registeredSingletons.add(beanName);
    }
}

private final Map singletonObjects = CollectionFactory.createConcurrentMapIfPossible(16);

可知Spring內(nèi)部四通過(guò)一個(gè)ConcurrentMap來(lái)管理單件bean的馋没。獲取bean時(shí)候會(huì)先看看singletonObjects中是否有降传,有則直接返回,沒(méi)有則創(chuàng)建后放入。

看個(gè)時(shí)序圖:


image.png

Spring的bean工廠管理的單例模式管理的是多個(gè)bean實(shí)例的單例笔链,是工廠模式管理所有的bean,而每個(gè)bean的創(chuàng)建又使用了單例模式鉴扫。

4.4 使用場(chǎng)景

  • 同一個(gè)jvm應(yīng)用的不同模塊需要使用同一個(gè)對(duì)象實(shí)例進(jìn)行信息共享澈缺。
  • 需要同一個(gè)實(shí)例來(lái)生成全局統(tǒng)一的序列號(hào)

歡迎關(guān)注微信公眾號(hào):技術(shù)原始積累 獲取更多技術(shù)干貨

image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末莱预,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子依沮,更是在濱河造成了極大的恐慌枪狂,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,816評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件姥饰,死亡現(xiàn)場(chǎng)離奇詭異孝治,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)岂座,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,729評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)杭措,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人手素,你說(shuō)我怎么就攤上這事「迨颍” “怎么了崩哩?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,300評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵言沐,是天一觀的道長(zhǎng)险胰。 經(jīng)常有香客問(wèn)我矿筝,道長(zhǎng),這世上最難降的妖魔是什么跋涣? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,780評(píng)論 1 285
  • 正文 為了忘掉前任陈辱,我火速辦了婚禮,結(jié)果婚禮上陋守,老公的妹妹穿的比我還像新娘利赋。我一直安慰自己,他們只是感情好媚送,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,890評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布塘偎。 她就那樣靜靜地躺著,像睡著了一般咱扣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上闹伪,一...
    開(kāi)封第一講書(shū)人閱讀 50,084評(píng)論 1 291
  • 那天偏瓤,我揣著相機(jī)與錄音椰憋,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的褪储。 我是一名探鬼主播,決...
    沈念sama閱讀 39,151評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼鲤竹,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼辛藻!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吱肌,我...
    開(kāi)封第一講書(shū)人閱讀 37,912評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤氮墨,失蹤者是張志新(化名)和其女友劉穎吐葵,沒(méi)想到半個(gè)月后规揪,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體猛铅,經(jīng)...
    沈念sama閱讀 44,355評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡奸忽,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,666評(píng)論 2 327
  • 正文 我和宋清朗相戀三年月杉,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了抠艾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,809評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡腌歉,死狀恐怖翘盖,靈堂內(nèi)的尸體忽然破棺而出凹蜂,到底是詐尸還是另有隱情阁危,我是刑警寧澤汰瘫,帶...
    沈念sama閱讀 34,504評(píng)論 4 334
  • 正文 年R本政府宣布混弥,位于F島的核電站,受9級(jí)特大地震影響晾捏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜惦辛,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,150評(píng)論 3 317
  • 文/蒙蒙 一萤捆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧市怎,春花似錦辛慰、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)戚篙。三九已至溺职,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浪耘,已是汗流浹背乱灵。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,121評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留七冲,地道東北人痛倚。 一個(gè)月前我還...
    沈念sama閱讀 46,628評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像澜躺,于是被迫代替她去往敵國(guó)和親蝉稳。 傳聞我的和親對(duì)象是個(gè)殘疾皇子抒蚜,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,724評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)颠区,斷路器削锰,智...
    卡卡羅2017閱讀 134,638評(píng)論 18 139
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,135評(píng)論 2 7
  • 什么是Spring Spring是一個(gè)開(kāi)源的Java EE開(kāi)發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,445評(píng)論 1 133
  • 文章作者:Tyan博客:noahsnail.com 3.5 Bean scopes When you create...
    SnailTyan閱讀 1,882評(píng)論 0 1
  • 從圖書(shū)館旁邊搬走毕莱,心里有萬(wàn)分的不舍。以后看書(shū)借書(shū)就沒(méi)有之前那么方便了朋截,我暗下決心以后不管多忙部服,每個(gè)月至少要去兩次廓八。...
    米蘇聞閱讀 255評(píng)論 2 3