1. 程式人生 > >Spring源碼解析(二):obtainFreshBeanFactory

Spring源碼解析(二):obtainFreshBeanFactory

new 創建 get img inf context bstr 出現 關閉

spring的ApplicationContext容器的初始化流程主要由AbstractApplicationContext類中的refresh方法實現。

而refresh()方法中獲取新工廠的主要是由obtainFreshBeanFactory()實現的,後續的操作均是beanFactoty的進一步處理。

技術分享圖片

然後我們找到obtainFreshBeanFactory()

技術分享圖片

再找到第一步refreshBeanFactory();更新工廠中查看

技術分享圖片

發現是一個抽象類。找到它在AbstractRefreshableApplicationContext的實現類

技術分享圖片

發現它先通過hasBeanFactory判斷是否已經存在BeanFactory,如果存在則進行銷毀,關閉。如果已存在可能會出現問題。

技術分享圖片

保證不出現問題後,再進行創建createBeanFactory()

技術分享圖片

返回一個BeanFactory實例,隨後在為其設置序列化id setSerializationId,customizeBeanFactory定制工廠,加載bean定義 loadBeanDefinitions

其中找到在AbstractXmlApplicationContext類實現的loadBeanDefinitions抽象類

技術分享圖片

可以看到前三部都是在設置環境,設置資源加載:這個資源加載就是通過new ClasspathXmlApplicationContext();時裏面傳入的xml配置文件,設置實體解析器:將xml配置裏的bean裝換成實體

設置完後再進行初始化效驗,是否存在錯誤,比如類名之類錯誤等...

技術分享圖片

進行配置文件讀取

技術分享圖片

隨後的操作差不多都是對xml讀取操作。

然後我們回過頭來AbstractApplicationContext看 getBeanFactory();

技術分享圖片

發現他又是一個抽象類:找到AbstractRefreshableApplicationContext中的實現類

技術分享圖片

有沒有發現,我們又回到了AbstractRefreshableApplicationContext類,並且就是獲取refreshBeanFactory()處理的beanFactory,判斷是否為空,不為空就則返回。

最終到refresh()方法中,給後續方法加工處理。

這也就大致的走了一篇obtainFreshBeanFactory

本人也處於學習階段,以上如有錯誤或不恰當之處,歡迎指正....

Spring源碼解析(二):obtainFreshBeanFactory