(備註:上面說起的 FileSystemResource 以及 BeanDefinition若有不清楚,請閱讀我上一篇文章:spring源碼之IOC容器資源定位過程)面試
資源定位完成並獲取到對應的資源解析條件後,spring將會對獲取到的資源進行解析,而且將解析後的抽象數據結構註冊到IoC容器中。
spring
那咱們接下來就來看看spring 對 :數據結構
BeanDefinition的載入
學習
BeanDefinition的註冊3d
這兩步的處理過程在複雜的容器繼承層級中的處理過程是怎麼樣的呢?下面咱們就來簡單講講cdn
在資源定位成功後,經過實現原理的分析,咱們能夠看到,在初始化FileSystemXmlApplicationContext的過程當中,是經過XmlBeanDefinitionReader來讀取資源的,並委託它來完成具體的載入以及解析過程,因爲咱們這裏使用的是XML方式定義的資源文件,因此須要使用XmlBeanDefinitionReader,若是使用了其餘的BeanDefinition,就須要用其餘種類的BeanDefinitionReader來完成數據的載入工做了。xml
對於BeanDefinition的載入和解析工做的開始是從AbstractXmlApplicationContext類中的loadBeanDefinitions方法中調用的reader的loadBeanDefinitions方法開始的。接下來的調用流程我仍是和之前同樣整理成了一個調用的流程圖,並在各個調用節點備註了調用方法的做用,能夠根據這個流程圖到源碼環境細看狀況,同時這個流程也梳理出了一個比較清晰的思路,便於理解。(能夠保存到手機哦。說不定面試會用到)以下圖:對象
通過解析,咱們在xml文件定義的配置文件被解析成一個抽象的數據結構BeanDefinition數據結構,經過AbstractBeanDefinition爲入口,讓Ioc容器執行索引、查詢和操做。Ioc容器大體完成了管理Bean的數據準備工做,可是這個時候依賴注入實際上還沒發生,在此時容器也並無徹底起做用,如今BeanDefinition中的只是一些靜態的配置信息,要想徹底發揮容器的做用,還須要完成對數據想容器中註冊。blog
這個註冊爲Ioc容器提供了更好的使用方式,能夠在DefaultListableBeanFactory類中看到,容器實際上是用ConcurrentHashMap來持有BeanDefinition的,同時容器對這些信息進行處理和維護。繼承
此篇文章和上篇文章(spring源碼之IOC容器資源定位過程)就是我閱讀spring Ioc容器對資源定位o,加載和註冊的整調用流程的記錄。很明顯這兩篇文章只是講了大概的思路,具體的內容還須要具體在搭建源碼環境後閱讀。
確定會有同窗說,咦~,IoC容器的一些比較厲害的特性你咋沒寫處理呢?
對於依賴注入、aop實現、事務特性,若是在同一篇文章寫,可能會顯得思路不是很清晰,因此後面我會一一出個人記錄筆記,預知下文,能夠關注小弟的公衆號一塊兒同探討學習哈。
看完文章啦?聽首歌吧~(我還年輕我還年輕),不要忘記關注哦~
公衆號只作學習、記錄和交流,偶爾推推一些筆者以爲比較好聽的歌---- rofeya