本文很少涉及spring源碼的相關(guān)內(nèi)容,旨在提供一個(gè)不錯(cuò)的源碼閱讀的方法。
在此之前,筆者也多次試圖搭建源碼閱讀環(huán)境,都不得而終
希望本文能給喜歡閱讀源碼的朋友們一些幫助
環(huán)境搭建:
jdk 1.7
idea
maven
搭建spring application:
知其然方能之其所以然,我們先來搭建一個(gè)基于spring的demo程序。筆者使用的IDE提供模板程序創(chuàng)建功能,直接創(chuàng)建一個(gè)新的spring程序。(沒有該功能可手動(dòng)補(bǔ)全pom文件--見附圖)
代碼:
spring的容器(context)配置項(xiàng)
<context:annotation-config/>
開啟注解功能(筆者偏好注解)
<context:component-scan base-package="com.nd">
基礎(chǔ)包配置(應(yīng)用啟動(dòng)context會(huì)掃描加載基礎(chǔ)包下的bean)
bean組件創(chuàng)建
新建一個(gè)bean組件,并且加上注解@Component,這樣容器在初始化的時(shí)候會(huì)掃描該組件,并且加入到容器中。
main函數(shù)
首先通過xml配置文件初始化容器(context),然后在容器中獲取bean,調(diào)用bean的sayHello()方法并打印。
結(jié)果輸出:
進(jìn)入正題——源碼閱讀方法
源碼閱讀,從打印出Hello world! 才真正開始。學(xué)習(xí)過spring的小伙伴們都知道,spring的核心就是Ioc,也就是容器(代碼中的ApplicationContext)。
很多關(guān)于spring的書里都是這么形容spring的,spring提供了一個(gè)容器,就像是一個(gè)裝滿水的水桶,水桶里的水,就是容器中管理的bean。有了context(容器)和bean(組件),才有了后面各種強(qiáng)大的功能如DI、AOP等。因此,我們首要的目的,就是探索spring的容器和組件,以及容器是如何管理這些組件的。
下載源碼
查看AppicationContext,發(fā)現(xiàn)是一個(gè)已經(jīng)編譯過的.class文件,也許可以將就往下看,但缺少注釋難免不易理解。這時(shí)候就需要下載源碼了,功能強(qiáng)大的IDE在你查看.class文件時(shí),就提供了源碼下載功能,如下圖所示:
也可以使用maven來下載對(duì)應(yīng)jar包的源碼,這里查看maven的教程即可,筆者不在贅述。
優(yōu)秀的源碼一般都有注釋,通過注釋便可以了解類、方法以及變量在程序中的過程。比如上圖所示的方法,就是校驗(yàn)當(dāng)前容器中的beanFactory是否為active狀態(tài),如果不是就會(huì)拋出IllegalStateException。
通過源碼的注釋可以更準(zhǔn)確的理解源碼。
靜態(tài),代碼結(jié)構(gòu)圖
類圖有助于理解代碼的框架結(jié)構(gòu),借助工具查看接口ApplicationgContext代碼層級(jí)結(jié)構(gòu):
Application接口的父類:
Application接口的實(shí)現(xiàn)類:
可以看到,我們?cè)趍ain函數(shù)中使用到的ClassPathXmlApplicationContext就是Application的一個(gè)實(shí)現(xiàn)類,其同級(jí)目錄下還有一個(gè)FileSystemXmlApplicationContext,兩個(gè)類都是通過XML文件來加載ApplicationContext,只不過一個(gè)是通過文件系統(tǒng),一個(gè)通過類路徑而已。
由此可見通過對(duì)代碼層級(jí)結(jié)構(gòu)的剖析,可以更加全面的解析spring。建議動(dòng)手畫一畫類圖效果更佳。
動(dòng)態(tài),代碼調(diào)試
通過IDE的調(diào)試功能,可以跟蹤代碼的運(yùn)行過程:
現(xiàn)在我要對(duì)getBean方法進(jìn)行調(diào)試,看看容器是如何獲得該bean。
可以看到getBean方法的具體實(shí)現(xiàn)在抽象類AbstractApplicationContext中
這里調(diào)用了方法assertBeanFactoryActive(),顧名思義,是校驗(yàn)下beanFactory是否為active狀態(tài),如果要看它的具體實(shí)現(xiàn)(見源碼閱讀部分),就繼續(xù)Step into,如果這個(gè)方法是實(shí)現(xiàn)不是當(dāng)前的首要任務(wù),就可以執(zhí)行Step over(如果調(diào)試的步驟有什么不理解的朋友,就自行百度下如何在idea下進(jìn)行調(diào)試哦~)。
本文旨在闡明源碼閱讀的方法,就不在贅述大篇幅的源碼細(xì)節(jié)。
通過這個(gè)過程讀者便可以順藤摸瓜,逐步掌握框架細(xì)節(jié)的實(shí)現(xiàn)。
本文到這里也就要結(jié)束了,總結(jié)下:
一是源碼閱讀的環(huán)境搭建,通過搭建spring Application方法來閱讀源碼,免除下載構(gòu)建等煩惱
二是介紹了三種不錯(cuò)的源碼閱讀方法:
1、通過工具下載jar包的源碼,通過注釋更準(zhǔn)確地把握類、方法以及變量的作用
2、通過靜態(tài)分析,更清晰地掌握整體結(jié)構(gòu)
3、通過動(dòng)態(tài)運(yùn)行,順藤摸瓜,更容易地把握細(xì)節(jié)實(shí)現(xiàn)
本文到此就結(jié)束,希望能夠幫到大家。
純屬原創(chuàng),轉(zhuǎn)載請(qǐng)聲明出處。
——作者:陳來件(QQ:810522442)