spring源碼閱讀1——環(huán)境搭建&閱讀方法

本文很少涉及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文件--見附圖)

新建項(xiàng)目

代碼:

spring的容器(context)配置項(xiàng)
spring-config.xml

<context:annotation-config/>

開啟注解功能(筆者偏好注解)

<context:component-scan base-package="com.nd">

基礎(chǔ)包配置(應(yīng)用啟動(dòng)context會(huì)掃描加載基礎(chǔ)包下的bean)

bean組件創(chuàng)建
bean

新建一個(gè)bean組件,并且加上注解@Component,這樣容器在初始化的時(shí)候會(huì)掃描該組件,并且加入到容器中。

main函數(shù)
main

首先通過xml配置文件初始化容器(context),然后在容器中獲取bean,調(diào)用bean的sayHello()方法并打印。
結(jié)果輸出:

輸出結(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接口的父類:

在IDEA下使用Ctrl + H 可以查看

Application接口的實(shí)現(xiàn)類:

在IDEA下使用Ctrl + H 可以查看

可以看到,我們?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。

打斷點(diǎn)
getBean方法的實(shí)現(xiàn)

可以看到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)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評(píng)論 6 541
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,324評(píng)論 3 429
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評(píng)論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評(píng)論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 72,417評(píng)論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,783評(píng)論 1 329
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評(píng)論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,960評(píng)論 0 290
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,522評(píng)論 1 335
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 41,267評(píng)論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 43,471評(píng)論 1 374
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評(píng)論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,698評(píng)論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評(píng)論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評(píng)論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 52,204評(píng)論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 48,436評(píng)論 2 378

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 134,823評(píng)論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,914評(píng)論 6 342
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,193評(píng)論 2 7
  • 收集癖患者 晃過最耀眼的日子 留著冰冷的證據(jù) 曾問自己為何狂歡 沒有答案 尋著能填滿心的物質(zhì) 買了沒穿過的新衣 從...
    凌考拉閱讀 157評(píng)論 0 1
  • 明天你是否會(huì)想起 昨天你寫的日記 明天你是否還惦記 曾經(jīng)最愛哭的你 老師們都已想不起 猜不出問題的你 我也是偶然翻...
    初厭閱讀 274評(píng)論 0 1