Spring擴(kuò)展(2)-Spring Scope總結(jié)

0.先醒醒腦

WechatIMG2220.jpeg

1.關(guān)于scope

  • singleton:在spring容器中只存在一個(gè)實(shí)例,所有對(duì)該對(duì)象的引用將共享這個(gè)實(shí)例,該實(shí)例從容器啟動(dòng),并因?yàn)榈谝淮伪徽?qǐng)求而初始化之后,將一直存活到容器退出;
  • prototype:容器在接受到該類型對(duì)象的請(qǐng)求時(shí),會(huì)每次都重新生成一個(gè)新的對(duì)象實(shí)例給請(qǐng)求方,該對(duì)象的實(shí)例化以及屬性設(shè)置等工作都是由容器負(fù)責(zé)的,但是只要準(zhǔn)備完畢,并且對(duì)象實(shí)例返回給請(qǐng)求方的時(shí)候,容器就不再擁有當(dāng)前返回對(duì)象的引用,請(qǐng)求方需要自己負(fù)責(zé)當(dāng)前返回對(duì)象的生命周期管理工作,包括容器的摧毀;
  • request:XmlWebApplicationContext會(huì)為每個(gè)HTTP請(qǐng)求創(chuàng)建一個(gè)全新的RequestProcessor對(duì)象供當(dāng)前請(qǐng)求使用贱迟,當(dāng)請(qǐng)求結(jié)束后兑燥,該對(duì)象實(shí)例的生命周期即告結(jié)束;從不是很?chē)?yán)格的意義上說(shuō)晰甚,request可以看作prototype的一種特例刻像,除了場(chǎng)景更加具體 之外穿香,語(yǔ)意上差不多;
  • session:request相比,除了擁有session scope的bean的實(shí)例具有比request scope的bean可能更長(zhǎng)的存活時(shí)間绎速,其他方面真是沒(méi)什么差別。
  • global session:沒(méi)啥好說(shuō)的;

2.自定義scope

要實(shí)現(xiàn)自己的scope焙蚓,可以參照RequestScope和SessionScope,首先必須實(shí)現(xiàn)Scope接口或者繼承AbstractRequestAttributesScope,接口定義中的4個(gè)方法并非都是必須的纹冤,但get和remove方法必須實(shí)現(xiàn);

1.有了Scope的實(shí)現(xiàn)類之后,我們需要把這個(gè)Scope注冊(cè)到容器中,才能供相應(yīng)的bean定義使用。使用編碼注冊(cè)的方式是通過(guò)ConfigurableBeanFactory#registerScope注冊(cè)自定義scope;

  Scope customScope = new CustomScope(); 
  beanFactory.registerScope("custom",customScope);

正常情況下都是按如下方式注冊(cè):

    ClassPathXmlApplicationContext context = ...;
    context.getBeanFactory().registerScope("custom", new CustomScope());

2.使用xml的方式注入:

<bean id="custom" class="CustomScope"/>
<bean id="customerScope" class="org.springframework.beans.factory.config.CustomScopeConfigurer">
    <property name="scopes">
        <map>
            <entry key="custom">
                <bean class="custom"/>
            </entry>
        </map>
    </property>
</bean>
<bean id="usesScope" class="org.springframework.beans.TestBean" scope="custom"/>

原因是這樣:
CustomScopeConfigurer 實(shí)現(xiàn)了BeanFactoryPostProcessor,BeanClassLoaderAware等接口,SpringIoC容器允許BeanFactoryPostProcessor在容器實(shí)例化任何bean之前讀取bean的定義(配置元數(shù)據(jù))购公,并可以修改它萌京。而CustomScopeConfigurer中實(shí)現(xiàn)的postProcessBeanFactory方法;

public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException {
        if (this.scopes != null) {
            Iterator var2 = this.scopes.entrySet().iterator();

            while(var2.hasNext()) {
                Entry<String, Object> entry = (Entry)var2.next();
                String scopeKey = (String)entry.getKey();
                Object value = entry.getValue();
                if (value instanceof Scope) {
                    beanFactory.registerScope(scopeKey, (Scope)value);
                } else {
                    Class scopeClass;
                    if (value instanceof Class) {
                        scopeClass = (Class)value;
                        Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class");
                        beanFactory.registerScope(scopeKey, (Scope)BeanUtils.instantiateClass(scopeClass));
                    } else {
                        if (!(value instanceof String)) {
                            throw new IllegalArgumentException("Mapped value [" + value + "] for scope key [" + scopeKey + "] is not an instance of required type [" + Scope.class.getName() + "] or a corresponding Class or String value indicating a Scope implementation");
                        }

                        scopeClass = ClassUtils.resolveClassName((String)value, this.beanClassLoader);
                        Assert.isAssignable(Scope.class, scopeClass, "Invalid scope class");
                        beanFactory.registerScope(scopeKey, (Scope)BeanUtils.instantiateClass(scopeClass));
                    }
                }
            }
        }

    }

它同樣會(huì)去掃描加載的配置文件中的scope,并進(jìn)行注冊(cè);

補(bǔ)充:關(guān)于BeanFactoryPostProcessor的內(nèi)容,Spring IoC容器允許同時(shí)可以定義多個(gè)BeanFactoryPostProcessor,通過(guò)實(shí)現(xiàn)order接口來(lái)確定各個(gè)BeanFactoryPostProcessor執(zhí)行順序宏浩。注冊(cè)一個(gè)BeanFactoryPostProcessor實(shí)例需要定義一個(gè)Java類來(lái)實(shí)現(xiàn)BeanFactoryPostProcessor接口知残,并重寫(xiě)該接口的postProcessorBeanFactory方法。通過(guò)beanFactory可以獲取bean的定義信息比庄,并可以修改bean的定義信息求妹。

public interface BeanFactoryPostProcessor {
    void postProcessBeanFactory(ConfigurableListableBeanFactory var1) throws BeansException;
}

在Spring中內(nèi)置了一些BeanFactoryPostProcessor實(shí)現(xiàn)類乏盐,可遵循如下關(guān)系延伸閱讀;


1071792-20170320144908611-422885334.jpg

關(guān)于在spring-boot中自定義scope其實(shí)也類似制恍,改天再將案例貼出!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末父能,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子净神,更是在濱河造成了極大的恐慌何吝,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,561評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件鹃唯,死亡現(xiàn)場(chǎng)離奇詭異爱榕,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)坡慌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)黔酥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人八匠,你說(shuō)我怎么就攤上這事絮爷。” “怎么了梨树?”我有些...
    開(kāi)封第一講書(shū)人閱讀 157,162評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵坑夯,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我抡四,道長(zhǎng)柜蜈,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,470評(píng)論 1 283
  • 正文 為了忘掉前任指巡,我火速辦了婚禮淑履,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘藻雪。我一直安慰自己秘噪,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布勉耀。 她就那樣靜靜地躺著指煎,像睡著了一般。 火紅的嫁衣襯著肌膚如雪便斥。 梳的紋絲不亂的頭發(fā)上至壤,一...
    開(kāi)封第一講書(shū)人閱讀 49,806評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音枢纠,去河邊找鬼像街。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的镰绎。 我是一名探鬼主播脓斩,決...
    沈念sama閱讀 38,951評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼跟狱!你這毒婦竟也來(lái)了俭厚?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 37,712評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤驶臊,失蹤者是張志新(化名)和其女友劉穎挪挤,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體关翎,經(jīng)...
    沈念sama閱讀 44,166評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡扛门,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了纵寝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片论寨。...
    茶點(diǎn)故事閱讀 38,643評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖爽茴,靈堂內(nèi)的尸體忽然破棺而出葬凳,到底是詐尸還是另有隱情,我是刑警寧澤室奏,帶...
    沈念sama閱讀 34,306評(píng)論 4 330
  • 正文 年R本政府宣布火焰,位于F島的核電站,受9級(jí)特大地震影響胧沫,放射性物質(zhì)發(fā)生泄漏昌简。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評(píng)論 3 313
  • 文/蒙蒙 一绒怨、第九天 我趴在偏房一處隱蔽的房頂上張望纯赎。 院中可真熱鬧,春花似錦南蹂、人聲如沸犬金。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,745評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)晚顷。三九已至,卻和暖如春仗考,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背词爬。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,983評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工秃嗜, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 46,351評(píng)論 2 360
  • 正文 我出身青樓锅锨,卻偏偏與公主長(zhǎng)得像叽赊,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子必搞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評(píng)論 2 348

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