說到Spring相信所有的Javaer都如雷貫耳,作為Java領(lǐng)域的世界第一框架,幾乎在所有的Web項(xiàng)目中都能看到他的身影,隨著時(shí)間的推移Spring覆蓋的范圍越來越廣昏名,功能也越來越多,但其最核心的思想永遠(yuǎn)都是控制反轉(zhuǎn)IoC和面向切面AOP阵面。老實(shí)說這兩個(gè)特性用起來并不復(fù)雜轻局,理論原理也并不深奧,但理解和內(nèi)化的程度總有深淺之分样刷,就像讀Thinking in Java嗽交,初學(xué)者和工作兩三年的人看到的東西不同,工作兩三年和十年之人對內(nèi)容理解的又會不一樣颂斜。Tomcat之后想盡自己的能力去揭開Spring的面紗夫壁,向優(yōu)秀的源碼學(xué)習(xí),提高自己代碼的駕馭能力
之后的一段時(shí)間會以IoC和AOP兩條主線對Spring相關(guān)代碼進(jìn)行分析沃疮,為了盡量減少越來越復(fù)雜的擴(kuò)展功能干擾盒让,Spring源碼解析的版本定為3.2.8.RELEASE
,大家可以在https://github.com/spring-projects/spring-framework
上clone/fork
項(xiàng)目司蔬,再使用Gradle
進(jìn)行構(gòu)建邑茄,也可以通過maven
項(xiàng)目導(dǎo)入源碼的方式學(xué)習(xí)源碼
除了按兩條主線進(jìn)行講解之外,還會根據(jù)平常使用過程中常用功能的原理性分析進(jìn)行不間斷“加餐”俊啼,由于客觀上Spring的復(fù)雜性以及自身能力的局限性肺缕,難免出現(xiàn)表述不清,邏輯混亂和理解偏差,分析到如之前Tomcat源碼那般不太現(xiàn)實(shí)同木,請大家見諒
在正式開始之前浮梢,我們先想一想一個(gè)最簡單的,從配置文件讀取配置并獲得對象的流程中存在那些環(huán)節(jié)彤路,并按照面向?qū)ο蟮乃枷雽Ω鱾€(gè)環(huán)節(jié)進(jìn)行包裝描述
- 在Spring中支持各種類型各種格式的配置文件秕硝,比如xml的形式,key-value的形式等洲尊,我們可以將這些文件抽象成一個(gè)個(gè)
Resource
資源远豺; - 既然存在資源,那運(yùn)行的時(shí)候肯定要將這些資源加載進(jìn)內(nèi)存進(jìn)行操作坞嘀,加載的動作我們也可以將其封裝到一個(gè)加載器
Loader
內(nèi)躯护; - 再想想資源加載進(jìn)來要干什么,毫無疑問要獲得資源中的內(nèi)容丽涩,那么解析資源內(nèi)容對應(yīng)一個(gè)閱讀器
Reader
榛做; - 大家都知道我們配置對象使用
<bean>
,當(dāng)然除了<bean>
還有很多其他標(biāo)簽内狸,總之這些標(biāo)簽也都可以抽象出來形成一個(gè)個(gè)BeanDefinition
; - 眾多標(biāo)簽解析形成的實(shí)體肯定要在統(tǒng)一的地方進(jìn)行管理保存厘擂,那這個(gè)地方就是
BeanFactory
昆淡; - 同樣的,將標(biāo)簽對應(yīng)實(shí)體往
BeanFactory
中存放這個(gè)動作抽象成BeanRegistery
我們按著如上6個(gè)部分推測去閱讀源碼刽严,如果推測有偏差修正之昂灵,正確則關(guān)注實(shí)現(xiàn)細(xì)節(jié)