- Spring技術內幕:深入解析Spring架構與設計
- 計文柯
- 2458字
- 2018-12-31 15:02:39
前言
作為Java領域中最為成功的開源軟件之一,Spring在Java開發中,有不可替代的作用和地位。本書以Spring的源代碼為依托,從內部實現的角度,對Spring的設計原理、架構和運行機制進行了翔實的分析。
忽如一夜春風來,伴隨著Rod Johnson的 Expert One-on-One J2EE Design and Development(2002年)一書的出版而正式發布的Spring框架(也就是當年的interface21),經過這幾年的發展,已經逐漸成熟起來。吹面不寒楊柳風,Spring帶來的嶄新開發理念,也早已伴隨著它的廣泛應用而飛入尋常百姓家。
與此同時,隨著Spring的不斷成熟和完善,開源社區的成長,以及Rod Johnson的得力領導,以Spring為核心的一系列開源軟件產品也越來越豐富,現已發展成為一個包括軟件構建、開發、運行、部署整個軟件生命周期的產品族群。Spring不但改變了Java EE應用的開發和服務模式,向純商業軟件發起了強有力的挑戰,而且已成為Java軟件生態鏈中不可或缺的重要組成部分。它所具備的那種平易近人,但卻內涵豐富的品質,對我們這些軟件愛好者來說,實在是一個不可多得的學習范本。
簡化Java企業級應用開發是Spring框架的目標。其輕量級的開發思想,為開發者提供便利的出發點(for the developer, to the developer and by the developer—這是Rod Johnson在一次演講中的開場白),以及具有活力的開源社區,所有的這些,都為使用Java開發企業應用和Web應用帶來了福音。
在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、DBC、O/R映射、遠端調用等,通過這些系統組件為企業應用服務的實現提供驅動支持。這些由Spring或者其生態系統(其本身、子項目或者社區)提供的、類似于驅動模塊般的系統組件是開發應用時經常會用到的Java EE服務抽象。Spring讓用戶可以用POJO來開發具體的應用,而這些應用往往需要Java EE服務的有力支撐。通過使用Spring提供的這些類似于驅動組件的中間產品,通過這一層Java EE服務的抽象,用戶可以通過使用簡單的開發接口或者應用模板很方便地使用各種Java EE服務和靈活地選取提供這些服務的各種不同的具體實現方案。比如,可以在各種第三方開源軟件或者商業產品中自由地選擇。
Spring作為一個開源項目,它本身就是一個開放的生態系統。對于與Spring相關的一些項目,可以把它們看作某個領域的用戶應用,因為它們與Spring的實現緊密相關;或者,它們本身就作為Spring框架的應用案例,體現了許多使用Spring的技巧。這些都是我們開發應用的理想參考,比如ACEGI安全性框架和petclinic應用案例。一方面,可以把這些實現作為應用的一個基本方案加以裁剪,以滿足特定領域的需求;另一方面,通過剖析這些應用,可以為應用開發提供很好的參考,提高開發效率。
從更深層次的技術層面上來看,因為Spring是基于Java語言的應用平臺,如果我們能夠對作為Spring的運行環境的Java計算模型(比如JVM的實現原理)有一些了解,將會加深我們對Spring實現原理的理解。反射機制、代理類、字節碼技術等這些JVM特性都是在Spring實現中會涉及的一些Java計算環境的底層技術。一般的應用開發人員可能不會直接從事與JVM底層實現相關的工作,但是這些計算環境的底層知識對我們深入理解Spring是不可缺少的。
在本書的寫作過程中,VMware公司收購了Spring的運營者Spring Source。此次商業收購一方面反映了開源軟件中蘊含著的巨大商業價值,另一方面反映了Spring的發展趨勢:與云計算融合,以及Spring為自己規劃的云計算戰略—成為PaaS(Platform As a Service)服務的有力競爭者。在云計算這個全新的計算環境中,如何在發揮Spring在企業級應用開發中已經具備的優勢的基礎上,為云計算應用的開發提供高可靠性、高可用性、高可擴展性和高性能的應用平臺,是Spring團隊面臨的全新挑戰。Spring在這個嶄新領域的雄心和作為讓我們充滿好奇和期待,我們拭目以待!
閑話說了這么多,很多讀者可能已經有些迫不及待了,也許只有對Spring的實現身臨其境地接觸才是真實的,這里太多的文字已經成為一種累贅。本書將帶領你到Spring的核心實現這個茂密而又充滿生機的源代碼叢林中去大膽地探尋和小心地求證。在這里,你會驚奇地發現:這個過程就像是閱讀優美的散文或情節跌宕起伏的小說一樣,是與開源軟件開發者以及開發者社區的一種暢快淋漓的交流和對話,讓人如癡如醉。
本書面向的讀者
? 學習Java語言和Java EE技術的中高級開發者
Spring是使用Java語言實現的,很多功能的源碼實現都極其優秀,非常具有研究和參考價值。對這部分讀者來說,不僅可以從本書中了解到Spring的實現原理,而且還能通過Spring的源代碼,掌握一流的Java編碼技巧和Java EE開發技術。
? Spring應用開發人員
如果要利用Spring進行高級應用開發,抑或是相關的優化和擴展工作,僅僅掌握Spring的配置和基本使用是遠遠不夠的,必須要對Spring框架的設計思想、架構和運作機制有一定的了解。對這部分讀者而言,本書將帶領他們全面了解Spring的實現原理,從而加深對Spring框架的理解,提高自己的開發水平。同時,本書可以作為他們定制和擴展Spring框架的參考資料。
? 開源軟件愛好者
Spring是開源軟件中的佼佼者,它在實現的過程中吸收了很多開源領域的優秀思想,同時也有很多值得其他開源軟件學習的創新。尤為值得一提的是,本書分析Spring源代碼的方式也許值得所有想分析源代碼的愛好者們學習和借鑒。通過閱讀本書,這部分讀者不僅能領略到開源軟件的優秀思想,而且還能掌握分析源代碼的方法和技巧,從而進一步提高使用開源軟件的效率和質量。
? 平臺開發人員和架構師
前面已經反復強調,Spring的設計思想、架構和實現都非常優秀,是平臺開發人員和架構師們不可多得的參考資料。