SpringIOC初始化時序圖

手繪SpringIOC時序圖

通過繪製序圖來一步步瞭解springIOC初始化的原理

 

總體來說,springIOC初始化可以分爲三個模塊------定位、加載和註冊

再細分下去17個小模塊

1.尋找入口——>2.獲取配置文件路徑——>3.容器開始啓動——>4.開始解析配置文件路徑——>5.載入配置路徑——>6.分配路徑處理策略——>7.解析配置文件路徑——>8.加載配置文件信息——>9.開始解析配置文件——>10.分配解析配置文件策略——>11.將配置文件載入到內存——>12.載入<bean>元素——>13.載入<property>元素——>14.載入<property>子元素——>15.載入<list>子元素——>16.分配註冊策略——>17.開始向容器註冊

圖片中1-14可劃歸到定位,15-24加載,25-26註冊

下面我將逐個步驟加以介紹

可能會有小夥伴有疑問,我在看源碼的過程中是怎麼找到這個切入點的呢?其實很簡單,我是從應用反向推導出切入點,

回想當初我們在調用Spring的容器進行bean的獲取時,一般在主程序中這麼寫:

//創建Spring的工廠

ApplicationContext applicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");

 

我們都知道ApplicationContext是BeanFactory的一個子接口,算是SpirngIOC的一個容器,也叫Spring上下文。這就使我把目標投向了ClaasPathXmlAppliccation這個類。點開看一下

 

可以看出來ClassPthXmlApplicationContext的構造函數做了三件事(只有一個參數的構造函數最終也會調到這個方法上來)。

一.super(parent)

這調用了父類的構造函數,接下來的流程對應時序圖中的1-8,主要是爲了完成對配置文件路徑的解析

我們按着時序圖一路super點下去最終到了AbstractApplicationContext這個類,即第5步。

發現這裏調了個this()的本類的構造函數和setParent這個方法。在構造函數裏又調用了getResourcePatternResolver();

從名字上看應該能推測是做資源解析處理的,並賦值給成員變量resourcePatternResolver。

點進這個成員變量

發現這是一個接口繼承ReourceLoader並且有getResources方法。看到這裏我們明白了,原來getResourcePatternResolver是

返回一個資源加載器來方便我們後續去讀取配置文件。其實看到這裏按理說對這個方法也沒必要點進去深入瞭解了。但是好奇心使我還是想一探究竟,點進getResourcePatternResolver方法看看它是如何返回這個資源加載器的

 

可以看到PthMatchingResourcePatternResolver是要求傳入一個ResourceLoader類型的並且還賦值到了自己的成員變量上。但是爲什麼我們在上面new的時候只傳入了一個this呢?原因就是這個類是ResourceLoader的一個實現的子類,所以不衝突。

回到上面AbstractApplicationContext的setParent方法,其實就是給父容器賦值,但實際上我們在代碼中初始化的時候只傳入了一個String路徑名的話,這個值是賦空的。

二:setConfigLocations(configLocations)

這個就是講路徑字符串解析並且賦值到容器中的一個資格字符串數組中,感興趣的朋友可以深入討論,這裏不再贅述。

三:refresh()

 

refresh()方法的主要作用是:在創建 IOC 容器前,如果已經有容器存在,則需要把已有的容器銷燬和
關閉,以保證在 refresh 之後使用的是新建立起來的 IOC 容器。它類似於對 IOC 容器的重啓,在新建立
好的容器中對容器進行初始化,對 Bean 配置資源進行載入
 

 

圖截多了一部分,原諒博主還不太會用長截屏。

總之從圖片上可以看到這是一個模板方法模式,這裏規範了容器加載註冊的標準流程。其中真正幹主活obtainFreshBeanFactory告訴子類啓動refreshBeanFactory()方法,Bean定義資源文件的載入從 子類的refreshBeanFactory()方法啓動。順着時序圖找到doLoadBeanDefinitions方法,找到這個就很激動,因爲spring中真正做事的都是以do開頭的,其他同名不帶do的都是負責統籌調度的。

 

 

 

 

其實這段代碼只做了三件事,這三件事的每一件都必不可少

(1)獲取對XML文件的驗證模式

(2)加載XML文件,並得到對應的Document

(3)根據返回的 Document註冊Bean信息

這個三個步驟支撐着整個Spring容器部分的實現,尤其是第三步對配置文件的解析

這就完成了對配置文件的定位和加載和註冊

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章