Spring容器Bean的初始化

WebApplicationContext的三個(gè)實(shí)現(xiàn)類:XMLWebApplicationContext缘屹、GroovyWebApplicationContext和AnnotationConfigWebApplicationContext卡者。

應(yīng)用上下文的初始化

XmlWebApplcationContext

XmlWebApplcationContext是傳統(tǒng)的基于xml的Bean的定義。

web.xml中我們會(huì)添加一個(gè)ContextLoaderListener的listener从隆,首先它實(shí)現(xiàn)了ServletContextListener接口,可以接收上下文初始化完成和銷毀的事件缭裆。同時(shí)ContextLoaderListener還繼承了ContextLoader類键闺,從介紹來(lái)看ContextLoader的作用是執(zhí)行應(yīng)用上下文的初始化工作。

初始化WebApplicationContext

監(jiān)聽(tīng)器接收到ServletContext初始化完成的事件后澈驼,就由ContextLoader開(kāi)始初始化WebApplicationContext:首先從ServletContext中查找是否有自定義的contextClass辛燥,如未找到則使用默認(rèn)策略(spring-web包中的ContextLoader.properties), XmlWebApplicationContext的完整路徑就配置在其中;然后加載上下文類型的class,并初始化挎塌。

為根應(yīng)用上下文添加父上下文

對(duì)于純web應(yīng)用來(lái)說(shuō)徘六,其根應(yīng)用上下文的父上下文為NULL。

刷新根應(yīng)用上下文

  • 將ServletContext關(guān)聯(lián)給根應(yīng)用上下文榴都;
  • 將contextConfigLocation的值記錄到根應(yīng)用上下文待锈;
  • 初始化PropertySource(分別從servletContextInitParams、servletConfigInitParams嘴高、jndiProperties竿音、systemProperties、systemEnvironment中加載)拴驮,且該動(dòng)作在每次上下文刷新的時(shí)候都會(huì)執(zhí)行一次春瞬。

  • 個(gè)性化上下文:從ServletContext的初始化參數(shù)中查找globalInitializerClasses和contextInitializerClasses,并對(duì)initializer進(jìn)行排序套啤,然后依次初始化根應(yīng)用上下文宽气。

  • 根應(yīng)用上下文執(zhí)行刷新動(dòng)作

    • 準(zhǔn)備工作:將上下文設(shè)置為已生效;初始化PropertySource等

    • 刷新BeanFactory:清空bean并關(guān)閉BeanFactory(置為NULL)潜沦,然后創(chuàng)建新的并配置BeanFactory(DefaultListableBeanFactory)抹竹,如是否允許同名bean覆蓋就的bean、是否允許bean之間的循環(huán)引用止潮。之后就會(huì)加載BeanDefinition窃判,慢慢接近我們的主題。

    • 準(zhǔn)備BeanFactory:

      • 配置bean初始化后的處理(BeanPostProcessor)
      • 注冊(cè)ResolveableDependency
      • 檢查是否有bean需要load-time-waving喇闸,若有為BeanFactory添加BeanPostProcessor--LoadTimeWeaverAwareProcessor
      • 注冊(cè)默認(rèn)environment bean
    •  // Allows post-processing of the bean factory in context subclasses.
       postProcessBeanFactory(beanFa
       // Invoke factory processors registered as beans in the context.
       invokeBeanFactoryPostProcessors(beanFa
       // Register bean processors that intercept bean creation.
       registerBeanPostProcessors(beanFa
       // Initialize message source for this context.
       initMessageSo
       // Initialize event multicaster for this context.
       initApplicationEventMultica
       // Initialize other special beans in specific context subclasses.
       onRef
       // Check for listener beans and register them.
       registerListe
       // Instantiate all remaining (non-lazy-init) singletons.
       finishBeanFactoryInitialization(beanFa
       // Last step: publish corresponding event.
       finishRefresh();
      

為ServletContext添加新的屬性

屬性值為根應(yīng)用上下文袄琳。

加載BeanDefinition

為BeanFactory新建XmlBeanDefinitionReader,加載并從Root開(kāi)始解析xml配置文件燃乍,并遍歷各級(jí)的節(jié)點(diǎn)唆樊。節(jié)點(diǎn)的類型可以有:import、alias刻蟹、bean和beans逗旁。根據(jù)類型的不同的處理,最后都會(huì)集中在處理bean類型的節(jié)點(diǎn)舆瘪。將bean節(jié)點(diǎn)映射成BeanDefinitionHolder片效,并在BeanFactory中注冊(cè),key為bean的name英古,valude為BeanDefinition對(duì)象淀衣。由BeanFactory的ConcurrentHashMap類型的成員變量持有。

注冊(cè)完成后召调,發(fā)出組件注冊(cè)事件膨桥,并創(chuàng)建BeanComponentDefinition對(duì)象蛮浑。改對(duì)象持有改bean內(nèi)部bean的定義和外部bean的引用(BeanReference)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市只嚣,隨后出現(xiàn)的幾起案子沮稚,更是在濱河造成了極大的恐慌,老刑警劉巖册舞,帶你破解...
    沈念sama閱讀 219,110評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件蕴掏,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡环础,警方通過(guò)查閱死者的電腦和手機(jī)囚似,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,443評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)剩拢,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)线得,“玉大人,你說(shuō)我怎么就攤上這事徐伐」峁常” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,474評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵办素,是天一觀的道長(zhǎng)角雷。 經(jīng)常有香客問(wèn)我,道長(zhǎng)性穿,這世上最難降的妖魔是什么勺三? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,881評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮需曾,結(jié)果婚禮上吗坚,老公的妹妹穿的比我還像新娘。我一直安慰自己呆万,他們只是感情好商源,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,902評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著谋减,像睡著了一般牡彻。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上出爹,一...
    開(kāi)封第一講書(shū)人閱讀 51,698評(píng)論 1 305
  • 那天庄吼,我揣著相機(jī)與錄音,去河邊找鬼严就。 笑死霸褒,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的盈蛮。 我是一名探鬼主播废菱,決...
    沈念sama閱讀 40,418評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼技矮,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了殊轴?” 一聲冷哼從身側(cè)響起衰倦,我...
    開(kāi)封第一講書(shū)人閱讀 39,332評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旁理,沒(méi)想到半個(gè)月后樊零,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,796評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡孽文,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,968評(píng)論 3 337
  • 正文 我和宋清朗相戀三年驻襟,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片芋哭。...
    茶點(diǎn)故事閱讀 40,110評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡沉衣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出减牺,到底是詐尸還是另有隱情豌习,我是刑警寧澤,帶...
    沈念sama閱讀 35,792評(píng)論 5 346
  • 正文 年R本政府宣布拔疚,位于F島的核電站肥隆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏稚失。R本人自食惡果不足惜栋艳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,455評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望句各。 院中可真熱鬧吸占,春花似錦、人聲如沸诫钓。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,003評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)菌湃。三九已至问拘,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惧所,已是汗流浹背骤坐。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,130評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留下愈,地道東北人纽绍。 一個(gè)月前我還...
    沈念sama閱讀 48,348評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像势似,于是被迫代替她去往敵國(guó)和親拌夏。 傳聞我的和親對(duì)象是個(gè)殘疾皇子僧著,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,047評(píng)論 2 355

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