- Spring技術內幕:深入解析Spring架構與設計原理(第2版)
- 計文柯
- 5114字
- 2018-12-31 19:55:27
前言
為什么要寫這本書
本書探討了Spring框架的設計原理、架構和運行機制。作為在Java領域最為成功的開源軟件之一,Spring在Java EE開發中,使用者眾多。本書以Spring的源代碼為依托,結合Spring的設計思路,從內部實現的角度,對Spring的實現進行了翔實的分析,希望能夠通過這種分析,使讀者在開發者的層面掌握Spring,為開發Spring應用提供更扎實的框架基礎。
“忽如一夜春風來”,伴隨著2002年Rod Johnson的《Expert One-on-One J2EE Design and Development》一書的出版而正式發布的Spring框架(也就是當年的interface21),經過這幾年的發展,已經逐漸成熟起來。“吹面不寒楊柳風”,Spring帶來的嶄新開發理念,也早已伴隨著它的廣泛應用而“飛入尋常百姓家”。
與此同時,隨著Spring的不斷成熟和完善,開源社區的成長,以及Spring開發團隊的不懈努力,以Spring為核心的一系列開源軟件產品也越來越豐富,現已發展成為一個包括軟件構建、開發、運行、部署整個軟件生命周期的產品族群。Spring不但改變了Java EE應用的開發和服務模式,向純商業軟件發出了有力的挑戰,同時也成為Java軟件生態鏈中不可或缺的重要組成部分。它所具備的那種平易近人、內涵豐富的品質,對我們這些軟件愛好者來說,實在是一個不可多得的學習范本。
簡化Java企業應用的開發是Spring框架的目標。其輕量級的開發思想,為開發者提供便利的出發點(for the developer, to the developer and by the developer —這是Rod Johnson在一次演講中的開場白),以及具有活力的開源社區,所有的這些,都為使用Java開發企業應用和Web應用帶來了福音,這些都是Spring吸引我們的地方。
在Java企業應用中,與我們熟悉的企業應用服務器一樣,Spring也希望能夠集成管理企業應用資源,以及為應用開發提供平臺支持。在這一點上,Spring與UNIX和Windows等傳統意義上的操作系統,在計算系統中起到的作用是類似的。不同點在于,傳統操作系統關心的是存儲、計算、通信、外圍設備等這些物理資源的管理,并在管理這些資源的基礎上,為應用程序提供統一的平臺和服務接口;而Spring關心的是,如何為開發者集中管理在Java企業應用和Web應用中涉及的數據持久化、事務處理、消息中間件、分布式計算等抽象資源,并在此基礎上,為應用提供了一個基于POJO的開發環境。盡管二者面向的資源、管理的對象、支持的應用,以及使用的場景不同,但它們在整個計算系統中的定位,卻有著可以類比和相互參考之處。所以,筆者根據對傳統操作系統的認識方法,粗淺地把Spring框架劃分為核心、組件和應用三個基本的層次,通過這三個層次中一些主要特性來剖析Spring的工作原理和運作機制。同時,也用這樣的認識邏輯來組織本書中要闡述的內容。
在這樣的層次劃分中,首先看到的是對IoC容器和AOP這兩個核心模塊的工作原理的分析,它們都是Spring平臺實現的核心部分;同時,它們也是Spring的其他模塊實現的基礎。雖然,對大多數開發者而言,都只是在此基礎上進行相關的配置和外部功能的使用,但是,深入理解這兩個核心模塊的工作原理和運作機制,對于我們更好地應用Spring進行開發是至關重要的。因為,從Spring要簡化Java EE開發的出發點來看,它是通過對POJO開發提供支持來實現的。具體地說,Spring通過為應用基于POJO的開發模式提供支持,從而使應用開發和復雜的Java EE服務實現解耦,并由此通過提高單元測試覆蓋率(也就是應用系統的可測試性)來有效地提高整個Spring應用的開發質量。在這樣的開發場景下,需要把為POJO提供支持的各種Java EE服務支持抽象到Spring應用平臺中去,并將其封裝起來。具體來說,這一系列的封裝工作,在Spring及其應用實現中,離不開IoC容器和AOP這兩個核心模塊的支持,它們在很大程度上體現了Spring作為應用開發平臺的核心價值。它們的實現是Rod Johnson在他的另外一本著作《Expert One-on-One J2EE Development without EJB》中所提到“Without EJB設計思想”的具體體現,同時,也深刻地體現了Spring背后的設計理念。
其次,在IoC容器和AOP這兩個核心模塊的支持下,Spring為了簡化Java EE的開發,為應用開發提供了許多現成的用戶態的系統組件,比如事務處理、Web MVC、JDBC、O/R映射、遠端調用等,通過這些系統組件,為企業應用服務的實現提供驅動支持。這些由Spring或其生態系統(其本身、子項目或者社區)提供的,類似于驅動模塊般的系統組件是開發應用時經常會用到的Java EE服務抽象。通過使用Spring提供的這些類似于驅動組件的中間產品,通過這一層Java EE服務的抽象,從而讓用戶可以通過使用簡單的開發接口或應用模板,不但能夠很方便地使用各種Java EE服務,還可以靈活地選取提供這些服務的各種不同的具體實現方案。讓應用可以在各種第三方開源軟件或者商業產品中自由選擇,充分體現了Spring作為應用平臺的開放性。
Spring作為一個開源項目,它本身就是一個開放的生態系統。對于和Spring相關的一些項目,可以把它們看做在某個領域的用戶應用,因為它們是和Spring實現緊密相關的,或者它們本身就作為Spring框架的應用案例,體現了許多使用Spring的技巧。這些內容都是我們開發應用時的理想參考,并且會隨著技術的發展而不斷豐富,比如Spring DM、Spring FLEX、ACEGI安全性框架,以及Pet Clinic應用實例等。一方面,可以把這些實現作為應用的一個基本方案加以裁剪,以滿足特定領域的需求;另一方面,通過剖析這些應用,可以為應用開發提供很好的參考和借鑒,提高應用開發的效率。
從更深層次的技術層面上來看,因為Spring是一個基于Java語言的應用平臺,如果我們能夠對Spring的運行環境Java計算模型(比如JVM的實現原理)有一些了解,將會加深我們對Spring實現原理的理解。反射機制、代理類、字節碼技術等這些JVM特性,都是在Spring實現中會涉及的一些Java計算環境的底層技術。一般的應用開發人員可能不會直接從事與JVM底層實現相關的工作,但是,這些計算環境的底層知識對深入理解Spring是不可缺少的。
說了這么多,很多讀者可能已經有些迫不及待了,只有對Spring的設計和實現身臨其境地接觸才是真實的,這里太多的文字已經成為一種累贅。本書將帶領你到Spring核心設計這個茂密而又充滿生機的源代碼叢林中去一探究竟。在這里,你會驚奇地發現:這個過程就像是閱讀優美的散文一樣,是與開源軟件開發者及開發者社區之間的一種暢快淋漓的交流,讓人如癡如醉。
第1版與第2版的區別
本書是第2版,在寫作過程中吸收了讀者對上一版內容的許多意見和建議,比如著重增加了對Spring宏觀框架和設計方面的闡述,加強了對Spring各種特性應用場景方面的描述,并結合了深入具體的源代碼實現。希望通過這些改進,給讀者一個從應用到設計再到實現的完整理解,彌補第1版中深度有余,內容層次不夠豐富,分析手法單一等諸多不足。
較第1版而言,第2版的改動主要體現在以下幾個方面,希望讀者能夠在閱讀中體會。
在內容闡述方式上,對每一章的內容進行了調整和重新編排,基本按照“使用場景”、“設計和實現過程”、“源碼實現”這樣的邏輯來重新組織大部分內容。希望通過這樣的組織方式,能夠使讀者以由表及里,由配置應用到設計實現,從抽象到具體的方式來了解Spring的各個模塊,從而豐富對Spring各個層次的認識。
在基于實現源碼分析的基礎上,增加了許多對Spring設計的分析,這些設計分析主要包括:在各個Spring模塊中,核心類的繼承關系、主要接口設計、主要功能特性實現的對象交互關系等。在描述這部分內容時,大多以UML類圖和時序圖的方式給出,從而幫助讀者對Spring的設計有一個直觀的了解,而不至于一下子就深入到Spring源代碼實現中去,導致只見樹木不見森林,另一方面也可以改善對Spring源代碼解讀的學習曲線。同時,在設計分析的過程中,盡可能地對在Spring設計中使用到的一些典型設計模式進行提示,通過這種方式使讀者可以體會到各種設計模式在Spring設計中的靈活運用;結合Spring的設計和實現為設計模式的運用提供一系列絕佳的實際案例,從而提高讀者對軟件設計的理解和設計模式的實際運用能力。
在具體內容的呈現上,對上一版的內容進行了一些調整,這些調整包括:增加了第1章,對Spring項目的概要情況進行了簡要闡述;同時把第1版中的一些內容,比如源代碼環境的準備、Spring發布包的構建、Spring IDE的基本使用,以及Pet Clinic應用實例的分析等內容,放到了附錄部分進行闡述。除此之外,在這一版中,根據Spring項目的自身發展情況增加了一些新的內容,比如對Spring DM和Spring FLEX這兩個模塊的分析。通過對這些Spring模塊的分析,一方面可以了解Spring的發展歷程,豐富視野;另一方面,也可以看到Spring與時俱進的旺盛生命力。
讀者對象
? 學習Java語言和Java EE技術的中高級讀者
Spring是利用Java語言實現的,其很多特性的設計和實現都極其優秀,非常具有研究和參考價值。對這部分讀者來說,不僅可以從本書中了解Spring的實現原理,還能通過Spring的設計原理和源代碼實現,掌握大量的Java設計方法、設計模式、編碼技巧和Java EE開發技術。
? Spring應用開發人員
如果要利用Spring進行高級應用開發,抑或是相關的優化和擴展工作,僅僅掌握Spring的配置和基本使用是遠遠不夠的,必須要對Spring框架的設計原理、架構和運作機制有一定的了解。對這部分讀者而言,本書將帶領他們全面了解Spring的設計和實現,從而加深對Spring框架的理解,提高開發水平。同時,本書可以作為他們定制和擴展Spring框架的參考資料。
? 開源軟件愛好者
Spring是開源軟件中的佼佼者,它在實現的過程中吸收了很多開源領域的優秀思想,同時也有很多值得學習的創新。尤為值得一提的是,本書分析Spring設計和實現的方式也許值得所有開源軟件愛好者進行學習和借鑒。通過閱讀本書,這部分讀者不僅能領略到開源軟件的優秀思想,還可以掌握分析開源軟件源代碼的方法和技巧,從而進一步提高使用開源軟件的效率和質量。
? 平臺開發人員和架構師
Spring的設計思想和體系結構、詳細設計和源碼實現都是非常優秀的,是平臺開發人員和架構師們不可多得的參考資料。
如何閱讀本書
本書主要內容分為三個部分,分別闡述了Spring的核心、組件和應用三個方面。在展開這三個部分的內容之前,第1章對Spring的項目情況和整體架構進行了簡要的介紹,這一章就像一個熱身活動,為本書的主要內容做鋪墊,如果您已經很熟悉Spring的使用,這一章可以自行跳過,直接進入到下面三個主體部分的內容。
第一部分詳細分析了IoC容器和AOP的實現,這部分內容是理解Spring平臺的基礎,適合對Spring的運行機理有深入了解需求的讀者閱讀。在對AOP實現模塊的分析中涉及的一些JVM底層技術,也是讀者需要具備的背景知識。
第二部分深入闡述了基于Spring IoC容器和AOP的Java EE組件在Spring中的實現。在這部分內容中可以看到,每一個組件實現的內容基本上都是相對獨立的,讀者可以結合自己的需求選讀。如果對Spring Web MVC的實現感興趣,可以閱讀第4章;如果對Spring提供的數據庫操作的實現機制感興趣,可以閱讀第5章;如果對Spring中提供的統一事務處理的實現感興趣,可以閱讀第6章;如果對Spring提供的各種不同的遠端調用實現感興趣,可以閱讀第7章。
第三部分講述了一些基于Spring的典型應用的實現。如果讀者對在Spring應用中如何滿足應用資源的安全性需求方面的內容感興趣,可以閱讀第8章,本章對為Spring應用提供安全服務的ACEGI框架的實現進行了分析,在深入了解這部分內容的基礎上,讀者可以根據自己的應用需求定制自己的安全系統。第9章分析了Spring DM的設計和實現,通過Spring DM,可以將Spring應用便利地架構到OSGi的框架上去。第10章分析了Spring Flex的設計和實現,為使用Adobe Flex作為應用前端架構的Spring應用提供參考。
閱讀本書時,建議讀者在自己的計算機中建立一個源代碼閱讀環境,這樣一方面可以追蹤最新的源代碼實現,另一方面,可以在閱讀的過程中進行各種方式的索引和動手驗證,加深對開源軟件開發方式的體會。關于如何建立Spring的源代碼環境,進行Spring項目的構建,通過IDE閱讀源代碼的基本方法等,感興趣的讀者可以參考本書附錄中的內容。
在附錄A、B、C中,對如何建立Spring項目環境進行了簡要介紹,這部分內容包括如何獲取Spring項目的源代碼,如何構建Spring的發布包,如何使用Spring IDE工具等。這些知識不但適用于建立Spring的源代碼研究環境,還適用于其他的Java開源項目,有一定的普遍性和參考價值。對于不同的Java開源項目,其使用的源代碼管理工具、代碼倉庫的位置、權限配置會有所不同,但是,整個源代碼的獲取過程與獲取Spring源代碼的過程是類似的,整個構建過程也與Spring的構建方式大體相似,是非常值得我們參考的。
在附錄D中,對伴隨Spring項目的應用實例Pet Clinic進行了分析,這個應用實例為Spring應用開發提供了一個現實的使用案例,雖然簡單,卻相對完整。這個應用實例本身也是Spring團隊的作品,是Spring項目發布的一部分,其中為我們更好地使用Spring提供參考。
勘誤和支持
由于作者對Spring的認知水平有限,再加上寫作時的疏漏,書中還存在許多需要改進的地方。在此,歡迎讀者朋友們指出書中存在的問題,并提出指導性意見,不甚感謝。如果大家有任何與本書相關的內容需要與我探討,可以發郵件到jiwenke@gmail.com,也可以加入本書微群q.weibo.com/943166,我會及時給予回復。最后,衷心地希望本書能給大家帶來幫助,并祝大家閱讀愉快!
致謝
感謝互聯網,感謝開源軟件,感謝Java,感謝Spring,感謝我們的社區,讓我體驗到如此美妙的開放氛圍,體會到開源軟件如此獨特的魅力!好了,不多說了,筆者真誠地希望通過本書為你打開一個小小的入口,曲徑通幽,通過這個入口,讓我們一起在由開源軟件和互聯網構成的美麗風景中快樂地旅行!
計文柯(Wenke J)
- 深度實踐OpenStack:基于Python的OpenStack組件開發
- Ceph Cookbook
- Python自動化運維快速入門(第2版)
- Mastering Articulate Storyline
- SQL Server 2008 R2數據庫技術及應用(第3版)
- Serverless Web Applications with React and Firebase
- OpenMP核心技術指南
- C編程技巧:117個問題解決方案示例
- PowerDesigner 16 從入門到精通
- Clojure High Performance Programming(Second Edition)
- WCF全面解析
- Go語言編程之旅:一起用Go做項目
- 前端Serverless:面向全棧的無服務器架構實戰
- Daniel Arbuckle's Mastering Python
- LiveCode Mobile Development Hotshot