spring墳?zāi)怪産ean實例化過程

Spring框架是一個開源的java平臺充易,基于Spring框架開發(fā)服務(wù)項目非常容易随抠,迅速和健壯裁着。框架簡單理解就是封裝一層拱她,而這一層可以稱為其原理二驰。如果不明其理,可能會處處入坑秉沼,漂浮不落地感覺桶雀,哈哈 扯了好多廢話,Spring工廠化 IOC 配置化氧猬,我們可以通過xml 配置 bean背犯,但這里想記錄的是bean的實例化過程。

首先一個疑惑是以前的tomcat去哪里了盅抚?他們是如何銜接的呢漠魏?tomcat中有一個ServletContextListener的概念,spring中有一個ContextLoaderListener概念(其實也是個ServletContextListener)妄均,截圖看下源碼怎說吧柱锹,spring一般是在contextLoaderListener這里listener里初始化的哪自。


前戲好了,進(jìn)入主題吧禁熏。spring的啟動過程我先人為的分成2個大階段

一壤巷,

1 容器啟動階段

2 ? 加載配置

3 ? 分析配置信息

4 ? 裝載在BeanDefinition (元數(shù)據(jù) 存放了一個bean 屬性 屬性值 等metadata信息)

5? BeanDefinitionRegistryPostProcessor 標(biāo)準(zhǔn)BeanFactoryPostProcessor的擴展,BeanFactoryPostProcessor的作用是用來進(jìn)一步定義注冊的BeanDefinition.

6? 容器擴展機制(BeanFactoryPostProcessor僅次于BeanDefinitionRegistryPostProcessor被實例化瞧毙。它們在同一個方法進(jìn)行實例化胧华,只是順序有先后)PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors

。宙彪。矩动。。

二释漆,

1. 實例化;

2. 設(shè)置屬性值;

3. 如果實現(xiàn)了BeanNameAware接口,調(diào)用setBeanName設(shè)置Bean的ID或者Name;

4. 如果實現(xiàn)BeanFactoryAware接口,調(diào)用setBeanFactory 設(shè)置BeanFactory;

5. 如果實現(xiàn)ApplicationContextAware,調(diào)用setApplicationContext設(shè)置ApplicationContext

6. 調(diào)用BeanPostProcessor的預(yù)先初始化方法;

7. 調(diào)用InitializingBean的afterPropertiesSet()方法;

8. 調(diào)用定制init-method方法悲没;

9. 調(diào)用BeanPostProcessor的后初始化方法;

下面詳細(xì)說下過程

?這個過程著重根據(jù)xml配置bean的時候用的占位符被解析的過程來說。

spring中通過xml 定義bean 同時提供了xmlparser 去解析加載然后解析xml文件中的各種bean的定義男图,將xml文件中的每一個元素分別轉(zhuǎn)換成一個BeanDefinition對象示姿,其中保存了從配置文件中讀取到的該bean的各種信息,然后通過BeanDefinitionRegistry將這些bean注冊到beanFactory逊笆,BeanDefinition被注冊到了 DefaultListableBeanFactory

一個博客說明了beandefinition構(gòu)建過程:http://www.cnblogs.com/digdeep/p/4518571.html

上面這些一開始我是誤解為這里就實力化程實例了栈戳,現(xiàn)在來看是錯的

下面看下實用的例子 我們知道 xml中bean屬性的配置可以提供占位符,最終會從spring的properties文件中找到值替換览露,

那么這個過程發(fā)生在哪里荧琼,這個過程發(fā)生在容器擴展機制這里,BeanDefinition注冊到了beanFactory之后差牛,在這里Spring為我們提供了一個擴展的切口,允許我們通過實現(xiàn)接口BeanFactoryPostProcessor 其中PropertyResourceConfigurer為其實現(xiàn)堰乔,該類的作用就是為了替換Beandefinition中占位符偏化,

下面是PropertyResourceConfigurer類中 被postProcessBeanFactory調(diào)用到的方法,其中說明了要替換對應(yīng)beanFactory中beanDefinition的占位符镐侯。

/**

* Visit each bean definition in the given bean factory and attempt to replace ${...} property

* placeholders with values from the given properties.

*/

@Override

protected void processProperties(ConfigurableListableBeanFactory beanFactoryToProcess, Properties props)throws BeansException {

StringValueResolver valueResolver = new PlaceholderResolvingStringValueResolver(props);

doProcessProperties(beanFactoryToProcess, valueResolver);

}

至此 bean的元數(shù)據(jù)beandefinition 已經(jīng)完善侦讨,進(jìn)入第二階段

bean的實例化的階段,實例化階段主要是通過反射或者CGLIB對bean進(jìn)行實例化苟翻。

腦子是個好東西韵卤,可是我只有一個,容量也不大崇猫,還是即使落地吧沈条。不然會有故障的風(fēng)險,哈哈哈哈诅炉,有些東西之前在為知筆記記錄過蜡歹,現(xiàn)在感覺碎片太多了屋厘,需要重新申請一個大磁盤整理一下。稍后會陸續(xù)更新吧^_^月而。(整理篇)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗洒,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子父款,更是在濱河造成了極大的恐慌溢谤,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件憨攒,死亡現(xiàn)場離奇詭異溯香,居然都是意外死亡,警方通過查閱死者的電腦和手機浓恶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進(jìn)店門玫坛,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人包晰,你說我怎么就攤上這事湿镀。” “怎么了伐憾?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵勉痴,是天一觀的道長。 經(jīng)常有香客問我树肃,道長蒸矛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任胸嘴,我火速辦了婚禮雏掠,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘劣像。我一直安慰自己乡话,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布耳奕。 她就那樣靜靜地躺著绑青,像睡著了一般。 火紅的嫁衣襯著肌膚如雪屋群。 梳的紋絲不亂的頭發(fā)上闸婴,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天,我揣著相機與錄音芍躏,去河邊找鬼邪乍。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溺欧。 我是一名探鬼主播喊熟,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼姐刁!你這毒婦竟也來了芥牌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤聂使,失蹤者是張志新(化名)和其女友劉穎壁拉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體柏靶,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡弃理,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了屎蜓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片痘昌。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖炬转,靈堂內(nèi)的尸體忽然破棺而出辆苔,到底是詐尸還是另有隱情,我是刑警寧澤扼劈,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布驻啤,位于F島的核電站,受9級特大地震影響荐吵,放射性物質(zhì)發(fā)生泄漏骑冗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一先煎、第九天 我趴在偏房一處隱蔽的房頂上張望贼涩。 院中可真熱鬧,春花似錦榨婆、人聲如沸磁携。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至闷供,卻和暖如春烟央,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背歪脏。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工疑俭, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人婿失。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓钞艇,卻偏偏與公主長得像啄寡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子哩照,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理挺物,服務(wù)發(fā)現(xiàn),斷路器飘弧,智...
    卡卡羅2017閱讀 134,599評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,748評論 6 342
  • Spring容器高層視圖 Spring 啟動時讀取應(yīng)用程序提供的Bean配置信息识藤,并在Spring容器中生成一份相...
    Theriseof閱讀 2,796評論 1 24
  • 昨晚做了一個夢: 夢見自己在寒冷的冬夜痴昧,圍爐的煤馬上就燒完了,我木有錢買煤了 冠王,哪怕一塊煤的錢都沒有赶撰。趁煤還...
    荒蕪的歲月閱讀 169評論 0 0
  • 第一回合: “是你先打我的”(音量:70分貝) “是你先打我的”(音量:75分貝) “是你先打我的”(音量:80分...
    生活在別處_a743閱讀 212評論 0 0