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

第1章 準備源代碼環境

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

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

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

1.1 安裝JDK

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

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

1.2 安裝Eclipse

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

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

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

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

圖1-1 在Eclipse中查看類的繼承關系

圖1-2 在Eclipse中參看方法調用關系

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

1.3 安裝輔助工具

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

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

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

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

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

圖1-4 SVN客戶端下載

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

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

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

圖1-5 在Eclipse中安裝插件

圖1-6 在Eclipse中安裝插件

圖1-7 在Eclipse中安裝插件

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

圖1-8 在Eclipse中安裝插件

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

圖1-9 在Eclipse中安裝插件

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

圖1-10 在Eclipse中安裝插件

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

圖1-11 在Eclipse中安裝插件

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

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

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

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

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

圖1-14 SVN客戶端在Windows系統中的使用

1.4 獲取Spring源代碼

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

圖1-15 Spring官方網站

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

圖1-16 下載Spring源代碼

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

圖1-17 下載Spring源代碼

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

圖1-18 下載Spring源代碼

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

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

圖1-19 下載Spring源代碼

1.5 Spring源代碼的組織結構

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

圖1-20 Spring源代碼結構

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

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

圖1-21 Spring源代碼包的內部結構

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

圖1-22 Spring源代碼庫的結構

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

1.6小結

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

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

主站蜘蛛池模板: 融水| 桑日县| 平昌县| 上杭县| 咸阳市| 延寿县| 神农架林区| 陵水| 板桥市| 文化| 蓬溪县| 渝中区| 大方县| 肇庆市| 塘沽区| 丹巴县| 武鸣县| 忻州市| 曲沃县| 揭东县| 望谟县| 南昌县| 拉萨市| 米林县| 嘉义县| 迁西县| 新龙县| 安康市| 上饶市| 南充市| 江城| 濮阳县| 江华| 西乌| 明光市| 察哈| 宾川县| 鄯善县| 泰来县| 丹寨县| 盖州市|