用了Spring幾年,平時也斷斷續續在項目里看過一些源碼,大多都是比較模糊的,因為一旦從一個地方進去就找不到方向了,只能知道它大概是做了什么事能達到這個功能或者效果,至於細節一般沒有太深入去研究。后來才知道是學習方式有誤,正常的應該是從它最原始的地方下手,至於學習Spring源碼原因就是因為它的方便和快捷還有顛覆了傳統的開發模式。例如剛開始學Servlet要編寫大量的Servlet,然后又要New不同的對象,然后又要在業務層調用JDBC,還要手動開關事務,還要處理異常等等。Spring核心就是IOC和AOP,所以接下來主要是想系列化的去研究ioc和aop在底層是如何做的。
#開發環境:
系統:windows7.64位;jdk版本:1.7; eclipse版本:Mars Release (4.5.0); Gradle版本:gradle-2.4.1.2; Spring源碼:3.2x。
#下載Spring源碼
- 第一步肯定是需要把源碼下載下來,因為是研究spring的源碼,所以我是直接download到我本地;’前往github下載Spring源碼(或者通過git clone方式下載代碼,當然前提是電腦里此時已經安裝了github客戶端或者類似的工具),可以選擇下載mater分支,或者點擊Tags選擇release版本。(我選的是3.2x版本,因為之前有看過網上說早的版本變動小,最主要是3.2版本編譯比較穩)
2.下載成功后打開壓縮包解壓到指定目錄,spring核心項目都包含在里面,例如spring-core,spring-context,spring-jdbc。源碼總共不會超過20M。
3.此時並不能直接導入eclipse,因為這些項目還沒進行編譯,需要通過gradle進行編譯后才能被eclipse所識別,所以在此之前必須安裝好gradle插件,安裝gradle教程可以參考網上文章,和配置maven環境一樣的步驟;配置成功后通過cmd進入到指定的項目根目錄下執行
gradle cleanidea eclipse(比如我想編譯spring-core,我的項目位置在E:/spring/spring-core,則需要進入到
下執行E:/spring/spring-core
,如果在gradle cleanidea eclipse
)。E:/spring 這個目錄下執行的話會把所有的spring模塊都進行編譯
4.編譯成功后如下圖所示,這時候就可以導入到eclipse。
5.直接import編譯好的模塊到eclipse,完整導入如下所示:
#遇到的問題:
提示test不存在,點擊項目右鍵->Build Path->Java Build Path,在彈框中選擇Libraries,移除這些紅色X的包。
# 導入后雖然沒報錯但並不代表已經成功了,我們最終的目的是為了能讓spring項目跑起來方便我們去研究一些底層的實現。這時候就需要測試一下是否能正常運行;在spring項目內部提供了大量的test方法,其中我找了一個比較感興趣的IOC測試類,全稱叫 FactoryBeanTests.java,這個類在spring-beans項目下的根錄。
#FactoryBeanTests-withAutowiring.xml詳情
#運行后如下所示