官术网_书友最值得收藏!

第1章 準(zhǔn)備源代碼環(huán)境

半畝方塘一鑒開,天光云影共徘徊。

問渠哪得清如許,為有源頭活水來。

—【宋】朱熹 《觀書有感》

1.1 安裝JDK

在開發(fā)Spring應(yīng)用和分析Spring源代碼之前,需要做一些準(zhǔn)備工作,其中搭建Java環(huán)境是必不可少的。Spring 3.0要求Java 5以上版本,JDK需要1.5或1.5以上版本。如果JDK的版本低于1.5,則可進(jìn)入網(wǎng)站http://Java.sun.com/javase/downloads下載最新的JDK安裝程序。

提示 安裝完后,要檢查JDK是否配置正確。某些第三方的程序會把自己的JDK路徑加到系統(tǒng)PATH環(huán)境變量中。這樣,即便安裝最新版本的JDK,系統(tǒng)還是會使用第三方程序所帶的舊版本JDK。這種情況下,Java環(huán)境可能無法正常運行,手工修改系統(tǒng)PATH路徑可以解決這個問題,比如重新設(shè)置PATH路徑指向新JDK的安裝路徑。

1.2 安裝Eclipse

運行Spring只需要JDK,但是一個好的開發(fā)環(huán)境和源代碼閱讀環(huán)境可以事半功倍。Eclipse是最流行的Java集成開發(fā)環(huán)境之一,Eclipse的JDT提供了良好的代碼分析功能,它們是我們在分析Spring的實現(xiàn)原理過程中會用到的基本工具。比如,可以用Eclipse分析Java類和接口的繼承關(guān)系、查看Java方法的調(diào)用關(guān)系、搜索代碼等。

在Eclipse中分析Java類和接口的繼承關(guān)系的具體做法如下:在代碼區(qū)中選擇需要的類和接口定義,然后使用右鍵選取Open Type Hierarchy或按快捷鍵【F4】,可以在Hierarchy View中看到繼承關(guān)系,如圖1-1所示。

在Eclipse中分析Java方法的調(diào)用關(guān)系的具體做法如下:在代碼區(qū)中選擇相應(yīng)的方法定義,然后用右鍵選取Open Call Hierarchy或者按下快捷鍵【CTRL+ALT+H】,可以在Call Hierarchy視圖中看到方法的調(diào)用關(guān)系,提供了逐層的方法調(diào)用追溯的功能,對查找方法的相互調(diào)用關(guān)系非常有用,如圖1-2所示。

在Eclipse中使用搜索功能,使用菜單上的Search可以打開搜索對話框,搜索結(jié)果在Search View中顯示。如果雙擊Search View中的搜索結(jié)果列表中的某一項,就可以直接打開該搜索結(jié)果對應(yīng)的出處,具體如圖1-3所示。

圖1-1 在Eclipse中查看類的繼承關(guān)系

圖1-2 在Eclipse中參看方法調(diào)用關(guān)系

圖1-3 在Eclipse中使用搜索功能

1.3 安裝輔助工具

作為集成的IDE環(huán)境,Eclipse為許多相關(guān)的插件提供了應(yīng)用平臺。例如,SVN的Eclipse插件為開發(fā)者提供了很好的源代碼管理功能,Spring的Eclipse IDE插件為開發(fā)Spring應(yīng)用提供了很好的幫助。對應(yīng)的插件在Eclipse中安裝以后,這些功能就可以直接在Eclipse IDE環(huán)境中使用;通常這些插件是作為Eclipse的一個View或者一個Perspective出現(xiàn)在集成IDE環(huán)境中的。下面我們來看看這些插件在Eclipse中的安裝。我們先對在Eclipse中安裝SVN插件做一個簡要的說明,關(guān)于Spring Eclipse IDE的安裝和簡要使用,將在第8章中詳細(xì)介紹。

關(guān)于源代碼管理工具的具體使用,本書就不做詳細(xì)的說明了,記得早在10幾年前我使用的版本管理工具是CVS。當(dāng)時是在一臺SUN Ultra60工作站上與版本管理工具CVS有了第一次親密接觸。它有一個簡單的圖形界面,非常直觀,使用起來也很方便,從那時候起,我才開始有了源代碼管理的基本概念。后來發(fā)現(xiàn),這些概念在其他工具上也是同樣適用的,例如版本、分支、基線、合并、比較等。

慢慢更深入地接觸了軟件產(chǎn)品開發(fā)以后,知道這些操作都是在進(jìn)行軟件配置管理計劃時需要定義的基本過程,這些基本過程保證了軟件產(chǎn)品在協(xié)同開發(fā)和構(gòu)建過程中的一致性,成為軟件開發(fā)中不可缺少的變更管理的重要組成部分。無論是使用CVS、SVN還是ClearCase,是使用命令行方式還是圖形界面的方式,基本的概念都需要深刻的理解和掌握。ClearCase在大型商業(yè)軟件開發(fā)領(lǐng)域被普遍使用,而CVS和SVN卻是開源領(lǐng)域和中小型企業(yè)應(yīng)用開發(fā)領(lǐng)域的主角。

值得注意的是,CVS和SVN本身也是開源軟件,提供的功能已經(jīng)足以滿足開源軟件開發(fā)的需求。這里有個有趣的問題就是,不知道CVS和SVN本身的開發(fā)項目是不是用自己做的代碼管理?感興趣的讀者不妨去做個調(diào)研來告訴大家。如果讀者對開源軟件的源代碼管理感興趣,可以閱讀Open Source Development with CVS(作者Karl Fogel和Moshe Bar)這本書,書中詳細(xì)介紹了如何使用CVS對開源軟件的源代碼進(jìn)行管理。

Eclipse中自帶的源代碼管理客戶端就是CVS的客戶端,Eclipse使用者可以直接使用。此外,這個CVS客戶端因為有Eclipse的各種視圖的支持,所以使用起來也是非常的方便。但是,由于Spring 3.0的源代碼是用Subversion來進(jìn)行管理的,而在Eclipse的默認(rèn)安裝中是不帶SVN客戶端這個插件的,所以這里有必要對SVN客戶端的安裝和使用做簡要的介紹。這些源代碼管理工具是開源軟件開發(fā)中常用的,所以掌握這些工具的基本使用對我們理解開源軟件的開發(fā)方式有很大的幫助。我們在這里使用的是一個開源的SVN客戶端—Subclipse,一個在Eclipse IDE中使用的SVN插件。其官方網(wǎng)站是http://subclipse.tigris.org,其下載頁面如圖1-4所示。

圖1-4 SVN客戶端下載

在Eclipse的Help菜單下選擇Software Updates,如圖1-5所示。

打開Software Updates and Add-ons對話框,選擇Available Software面板,可以看到在我們的Eclipse IDE環(huán)境中已經(jīng)安裝的插件,如圖1-6所示。

單擊Add Site…按鈕打開Add Site對話框。具體的Eclipse更新地址可以在http://subclipse. tigris.org/單擊Download and Install頁面找到,我們在Location中輸入插件更新地址,結(jié)果如圖1-7所示。

圖1-5 在Eclipse中安裝插件

圖1-6 在Eclipse中安裝插件

圖1-7 在Eclipse中安裝插件

單擊OK按鈕關(guān)閉Add Site對話框。Eclipse獲取到插件列表,更新Software Updates and Add-ons對話框的內(nèi)容,并選擇Subdipse update sites,如圖1-8所示。

圖1-8 在Eclipse中安裝插件

勾選Subclipse插件及其子項,單擊Next按鈕,如圖1-9所示。

圖1-9 在Eclipse中安裝插件

單擊Install按鈕,顯示Progress Information進(jìn)度對話框開始下載安裝包,下載完成后的界面如圖1-10所示。

圖1-10 在Eclipse中安裝插件

插件安裝完成,重新啟動Eclipse, SVN Eclipse插件安裝完成,如圖1-11所示。

圖1-11 在Eclipse中安裝插件

這時可以看到在Eclipse中SVN的相關(guān)視圖,如圖1-12所示。

圖1-12 Eclipse中安裝好的SVN視圖

如果你不喜歡在Eclipse中使用SVN客戶端,還可以直接下載SVN的獨立客戶端進(jìn)行使用,比如TortoiseSVN(一只可愛的小海龜),這也是一個開源的源代碼管理工具,可以在http://tortoisesvn.tigris.org/下載,如圖1-13所示。

圖1-13 下載SVN獨立客戶端TortoiseSVN

下載安裝完成后,如果打開Windows的文件管理器,點擊右鍵,可以看到SVN的菜單選項已經(jīng)在操作列表里出現(xiàn)了,由于集成在Windows的文件管理器中,這個小海龜使用起來也是非常方便的。如圖1-14所示,可以看到小海龜?shù)腟VN操作選項列表。比如checkout和創(chuàng)建代碼庫等等。從這里看到的SVN的基本功能,和我們在Eclipse中使用的SVN客戶端的基本功能是類似的,但在這里的TortoiseSVN做為獨立的SVN客戶端,是脫離Eclipse而獨立使用的,所以在Eclipse中瀏覽代碼的時候需要注意對代碼的更新和同步。

圖1-14 SVN客戶端在Windows系統(tǒng)中的使用

1.4 獲取Spring源代碼

有了SVN客戶端的支持后,我們可以到Spring的官方網(wǎng)站上獲取Spring 3.0的源代碼。在Spring 3.0之前的源代碼版本中,是在sourceforge以CVS repository的形式提供下載的。但是,根據(jù)當(dāng)前Spring官方網(wǎng)站的信息,Spring 3.0版本的源代碼改為使用SVN方式進(jìn)行源代碼管理。進(jìn)入Spring官方網(wǎng)站http://www.springsource.org/,打開Project,然后選擇Spring(如圖1-15所示),可以看到關(guān)于Spring源代碼庫的描述,我們使用的代碼庫位置在Spring官方網(wǎng)站上可以找到,即https://src.springframework.org/svn/spring-framework/。

圖1-15 Spring官方網(wǎng)站

確定了Spring源代碼的下載位置后,我們開始使用Eclipse SVN客戶端進(jìn)行源代碼下載,具體過程是:在Eclipse→Windows→Open Perspective→Others,打開SVN Perspective,如圖1-16所示。

圖1-16 下載Spring源代碼

單擊添加SVN資源庫,添加Spring源代碼下載的代碼位置,單擊Finish,如圖1-17所示。

圖1-17 下載Spring源代碼

這時在SVN資源庫視圖中可以看到詳細(xì)的Spring源代碼的代碼庫結(jié)構(gòu),因為是開源項目,Spring的代碼庫對所有人開放check out權(quán)限。但是,如果要check in代碼,則需要相應(yīng)的SVN權(quán)限作為developer才可以,用右鍵點擊trunk,檢出代碼,單擊Finish,如圖1-18所示。

圖1-18 下載Spring源代碼

這時會經(jīng)歷較長時間的代碼檢出過程,這個過程把Spring代碼從服務(wù)器檢出到Eclipse的本地工作環(huán)境。代碼檢出完畢后,可以把Eclipse切換到Java Perspective,這時已經(jīng)可以在Packet Explorer中看到與Spring代碼庫同步的代碼了,如圖1-19所示:

這時就可以像在你自己的項目里使用Eclipse瀏覽代碼那樣來瀏覽Spring的源代碼了,整個Spring的源代碼已經(jīng)在我們面前毫無保留、一覽無遺地呈現(xiàn)了。

圖1-19 下載Spring源代碼

1.5 Spring源代碼的組織結(jié)構(gòu)

我們已經(jīng)把Spring的源代碼檢出到了本地,整個代碼的結(jié)構(gòu)如圖1-20所示,我們對它的目錄結(jié)構(gòu)做一些簡要的說明,以方便大家對源代碼進(jìn)行瀏覽。

圖1-20 Spring源代碼結(jié)構(gòu)

Build-spring-framework是整個Spring源代碼的構(gòu)建目錄,里面是項目的構(gòu)建腳本,如果要自己動手構(gòu)建Spring,可以進(jìn)入這個目錄使用ANT進(jìn)行構(gòu)建。其他的目錄從名字上就可以很容易地看出來是Spring的各個組成部分,比如,org.springframework.context是IoC容器的源代碼目錄,org.springframework.aop是AOP實現(xiàn)的源代碼目錄,org.springframework.jdbc是JDBC的源代碼部分,org.springframework.orm是O/R Mapping對應(yīng)的源代碼實現(xiàn)部分,org.springframework.samples.petclinic是Spring提供的一個應(yīng)用示例的源代碼,便于我們開發(fā)Spring應(yīng)用時參考。

Spring源代碼中的每個包(比如org.springframework.context)都以一個相對獨立的子項目存在于代碼庫中。之所以說這些包是子項目,是因為每個包都可以作為獨立的項目導(dǎo)入到Eclipse中,都有Eclipse的項目配置文件,有針對這些包的代碼的測試用例,這些測試用例組織在src/test目錄中。另外還有針對自己包的build構(gòu)建文件,這些構(gòu)建文件同時也是構(gòu)成整個Spring項目構(gòu)建的一部分。這種代碼組織結(jié)構(gòu)使得包之間的相互耦合相對較小,非常有利于各個子模塊的并行開發(fā)、集成與測試。在每個源代碼包中,都有著類似的代碼結(jié)構(gòu)劃分,比如src是源代碼目錄,其中的main目錄用來存放產(chǎn)品代碼,test用來存放測試代碼。main里面的java目錄用來存放java源文件,而resources目錄用來存放資源文件。target目錄用來存放編譯好的classes文件,這個target名字讓我想起了在嵌入式軟件的開發(fā)系統(tǒng)中也??吹竭@樣的目錄,在那些系統(tǒng)里,這些目錄常用來存放目標(biāo)代碼,往往還可以針對不同的處理器結(jié)構(gòu)和平臺(比如X86平臺、PPC平臺、ARM平臺等)。在這里,因為Java的跨平臺特性,所以只要一個target即可,也許這些名字也是Java起源于嵌入式系統(tǒng)開發(fā)的佐證之一吧。這些代碼的組織規(guī)劃很統(tǒng)一,讓整個Spring的源代碼看起來非常整齊,瀏覽起來非常方便。圖1-21以org.springframework.context包為例,大家可以體會一下。

圖1-21 Spring源代碼包的內(nèi)部結(jié)構(gòu)

下面看看整個Spring的代碼庫結(jié)構(gòu)。在整個代碼庫中,我們前面check out的是trunk上的代碼,也就是當(dāng)前Spring最新的提交代碼,相當(dāng)于CVS中的HEAD版本。如果要獲取Spring 3.0的某個基線版本的代碼,可以在tags目錄中看到,然后check out到本地即可,這個過程和check out在trunk上的代碼是一樣的。在使用SVN和CVS做代碼管理的時候,它的基本思路也和我們使用ClearCase的時候不太一樣,在ClearCase里,如果要檢出代碼,一般需要先拉一個分支,然后再做check out,這樣對并行開發(fā)沒有影響,同時使用ClearCase的時候往往需要對各種分支的權(quán)限做比較詳細(xì)的規(guī)劃;但在CVS和SVN中,管理過程有很大的不同,往往代碼的檢出和提交是比較自由的,但是對基線版本的構(gòu)建卻是比較嚴(yán)格的,所以在這里不太能夠看到分支的使用;這也是由開源軟件的開發(fā)特點決定的。讓我們回到前面的目錄結(jié)構(gòu),在tags目錄下,我們可以看到現(xiàn)在已經(jīng)開發(fā)好的基線版本,比如Spring3.0 M1/M2/M3等,這些都是一些重要的開發(fā)里程碑,熟悉軟件配置管理的讀者看到這里一定會發(fā)出會心的一笑,感覺又回到了我們在日常產(chǎn)品代碼開發(fā)中熟悉的配置環(huán)境中來了。如果你覺得基線版本的代碼更新太慢,而你又急切地想了解代碼的最新改動,可以直接參看trunk的代碼,這絕對是Spring開發(fā)團(tuán)隊最新出爐的作品。從這點上看,互聯(lián)網(wǎng)真的是把整個世界都變平了。另外一點值得注意的是,從現(xiàn)在的代碼組織結(jié)構(gòu)上可以看到,這個代碼倉庫是從Spring 3.0開始為Spring服務(wù)的,因而無法在這里找到Spring 3.0版本以前的Spring源代碼。如果需要獲取之前版本的源代碼,需要找到以前代碼庫的具體位置,這些信息可以到Spring的官方網(wǎng)站上獲取。現(xiàn)在我們看到的代碼庫的快照如圖1-22所示。

圖1-22 Spring源代碼庫的結(jié)構(gòu)

這就是我們看到的Spring源代碼!經(jīng)過這么多年的發(fā)展,其核心已經(jīng)比較穩(wěn)定了,包括各個基本包的設(shè)計和命名。同時,我們從這些源代碼的組織也隱約地看到了Spring的配置管理和構(gòu)建過程,比如項目組織、測試管理、構(gòu)建工具以及依賴關(guān)系管理工具的使用等,這些都為Spring代碼的高質(zhì)量開發(fā)奠定了一個良好的工程環(huán)境。有興趣的讀者不妨自己做個研究,看看Spring的構(gòu)建過程是怎樣完成的。

1.6小結(jié)

問渠哪得清如許,為有源頭活水來。本章我們從Spring的源頭開始,對Spring源代碼的工程環(huán)境進(jìn)行了介紹,通過這些介紹,讀者已經(jīng)具備自己動手對源代碼進(jìn)行分析的能力。另外,我們使用Eclipse開發(fā)環(huán)境,對源代碼進(jìn)行分析的一些實踐經(jīng)驗,以及和開源軟件開發(fā)過程緊密相關(guān)的一些基本知識進(jìn)行介紹,這些知識不僅對Spring適用,而且對其他的開源軟件開發(fā)也具有非常好的借鑒意義。

有了軟件工程環(huán)境的有力支持,以及在這個環(huán)境基礎(chǔ)上,對Spring源代碼結(jié)構(gòu)的基本了解,我們已經(jīng)具備了閱讀Spring源代碼的基本條件,就是這些源代碼,是我們深入了解Spring實現(xiàn)原理的有力武器,也是開源軟件最寶貴的財富。讓我們養(yǎng)成動手到源代碼中去看個究竟以解迷惑的習(xí)慣吧,從個人的切身體驗來看,這可是一個深入了解軟件實現(xiàn)原理的好習(xí)慣。對實現(xiàn)的商業(yè)軟件產(chǎn)品也是一樣如此。讓我們瞭望一下這片生機(jī)勃勃而又有些神秘的代碼叢林,就像探險者面對茂密的熱帶雨林那樣,一起做個深呼吸,準(zhǔn)備開始這充滿樂趣和挑戰(zhàn)的Spring源代碼之旅吧!

主站蜘蛛池模板: 淅川县| 赣州市| 大英县| 屏东县| 乌兰浩特市| 渝北区| 澳门| 东丰县| 清流县| 茌平县| 沙洋县| 和龙市| 郑州市| 兴安县| 岳阳县| 治县。| 治县。| 西乌珠穆沁旗| 大埔区| 宣汉县| 喀喇沁旗| 盘山县| 务川| 无锡市| 芦山县| 海淀区| 确山县| 台东县| 扎赉特旗| 南江县| 新河县| 全南县| 霍城县| 东丰县| 青阳县| 邵武市| 子长县| 静海县| 漳浦县| 淮安市| 阜南县|