首先看一下一個最基本的上下文應該是什麼樣子
ApplicationContext接口的註釋裏寫的很清楚:
一個基本applicationContext應該提供:spring
大部分上下文都實現了此接口. 此接口除了繼承了ApplicaitnContext接口的能力外. 還具備可配置上下文與生命週期管理功能.
其中最重要的是定義了refresh()方法. refresh()功能是加載配置.segmentfault
大部分上下文都繼承了此類.AbstractApplicationContext能夠說啓到承上啓下的做用.app
從繼承圖咱們看, AbstractApplicationContext實現了大部分的接口方法.
其中refresh()方法的實現.爲ApplicationContext提供了加載配置的能力.工具
加載的什麼配置呢?
其實:所謂加載的配置大部分都是加載Bean
上節分析了BeanFactory存儲BeanDefinition與Bean. 而且BeanFactory的createBean()方法能夠將BeanDefinition建立成Bean.spa
要想從BeanFactory中獲取Bean,就得先有BeanDefinition. 有了BeanDefinition,還要觸發BeanDefinition到Bean的建立.code
這裏就產生了兩個問題:xml
ApplicationContext扮演的角色也就顯而易見了.blog
ApplicationContext初始化的核心工做是將散落在各個目錄下的各類配置形式的Bean定義,蒐集起來解析成BeanDefinition併入庫到BeanFactory.而後觸發BeanDefinition建立成Bean,存到BeanFactory中繼承
至此: 整個spring啓動的脈絡就也清晰了. 兩大塊:Bean定義的蒐集+Bean的建立
.接口
`
[開發人員]--標註-->[Bean定義] --蒐集--> [BeanDefinition] --建立-->[Bean]
`
開發人員經常使用的標註Bean定義的方式有.
ApplicationContext將這些Bean定義轉爲BeanDefinition並非那麼容易.
第一步蒐集:須要把散落的Bean定義的載體找到.蒐集起來.(注意,ApplicationContext蒐集Bean定義的過程其實也是經過調用工具來執行的)
第二步解析.將XML或者JavaConfig中的標註了Bean定義的轉爲BeanDefinition
第三步:擴展點.BeanFactoryPostProcessor.實現了此接口的類能夠在BeanDefinition入庫到BeanFactory的這個階段中,修改BeanDefinition信息.這也是spring留下的擴展點。
BeanDefinitionRegistryPostProcessor與BeanFactoryPostProcessor與BeanPostProcessor區別:
BeanDefinition是物料
Bean是成品
BeanFactory 存儲物料,存儲成品.
ApplicationContext初始化: 蒐集物料,入庫到BeanFactory, 並觸發非懶加載成品的建立.
歡迎你們關注個人公衆號【源碼行動】,最新我的理解及時奉送。