Spring原始碼解析(二):obtainFreshBeanFactory
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
本人也處於學習階段,以上如有錯誤或不恰當之處,歡迎指正....