- Spring技術(shù)內(nèi)幕:深入解析Spring架構(gòu)與設(shè)計(jì)
- 計(jì)文柯
- 510字
- 2018-12-31 15:02:40
前言
作為Java領(lǐng)域中最為成功的開(kāi)源軟件之一,Spring在Java開(kāi)發(fā)中,有不可替代的作用和地位。本書(shū)以Spring的源代碼為依托,從內(nèi)部實(shí)現(xiàn)的角度,對(duì)Spring的設(shè)計(jì)原理、架構(gòu)和運(yùn)行機(jī)制進(jìn)行了翔實(shí)的分析。
忽如一夜春風(fēng)來(lái),伴隨著Rod Johnson的 Expert One-on-One J2EE Design and Development(2002年)一書(shū)的出版而正式發(fā)布的Spring框架(也就是當(dāng)年的interface21),經(jīng)過(guò)這幾年的發(fā)展,已經(jīng)逐漸成熟起來(lái)。吹面不寒楊柳風(fēng),Spring帶來(lái)的嶄新開(kāi)發(fā)理念,也早已伴隨著它的廣泛應(yīng)用而飛入尋常百姓家。
與此同時(shí),隨著Spring的不斷成熟和完善,開(kāi)源社區(qū)的成長(zhǎng),以及Rod Johnson的得力領(lǐng)導(dǎo),以Spring為核心的一系列開(kāi)源軟件產(chǎn)品也越來(lái)越豐富,現(xiàn)已發(fā)展成為一個(gè)包括軟件構(gòu)建、開(kāi)發(fā)、運(yùn)行、部署整個(gè)軟件生命周期的產(chǎn)品族群。Spring不但改變了Java EE應(yīng)用的開(kāi)發(fā)和服務(wù)模式,向純商業(yè)軟件發(fā)起了強(qiáng)有力的挑戰(zhàn),而且已成為Java軟件生態(tài)鏈中不可或缺的重要組成部分。它所具備的那種平易近人,但卻內(nèi)涵豐富的品質(zhì),對(duì)我們這些軟件愛(ài)好者來(lái)說(shuō),實(shí)在是一個(gè)不可多得的學(xué)習(xí)范本。
簡(jiǎn)化Java企業(yè)級(jí)應(yīng)用開(kāi)發(fā)是Spring框架的目標(biāo)。其輕量級(jí)的開(kāi)發(fā)思想,為開(kāi)發(fā)者提供便利的出發(fā)點(diǎn)(for the developer, to the developer and by the developer—這是Rod Johnson在一次演講中的開(kāi)場(chǎng)白),以及具有活力的開(kāi)源社區(qū),所有的這些,都為使用Java開(kāi)發(fā)企業(yè)應(yīng)用和Web應(yīng)用帶來(lái)了福音。
在Java企業(yè)應(yīng)用中,與我們熟悉的企業(yè)應(yīng)用服務(wù)器一樣,Spring也希望能夠集成管理企業(yè)應(yīng)用資源,以及為應(yīng)用開(kāi)發(fā)提供平臺(tái)支持。在這一點(diǎn)上,Spring與UNIX和Windows等傳統(tǒng)意義上的操作系統(tǒng)在計(jì)算系統(tǒng)中起到的作用是類似的。不同點(diǎn)在于,傳統(tǒng)操作系統(tǒng)關(guān)心的是存儲(chǔ)、計(jì)算、通信、外圍設(shè)備等這些物理資源的管理,并在管理這些資源的基礎(chǔ)上為應(yīng)用程序提供一個(gè)統(tǒng)一平臺(tái)和服務(wù)接口;而Spring關(guān)心的是如何為開(kāi)發(fā)者集中管理在Java企業(yè)應(yīng)用和Web應(yīng)用中涉及的數(shù)據(jù)持久化、事務(wù)處理、消息中間件、分布式計(jì)算等抽象資源,并在此基礎(chǔ)上為應(yīng)用提供了一個(gè)基于POJO的開(kāi)發(fā)環(huán)境。盡管二者面向的資源、管理的對(duì)象、支持的應(yīng)用,以及使用的場(chǎng)景不同,但它們?cè)谡麄€(gè)計(jì)算系統(tǒng)中的定位,卻有著可以類比和相互參考之處。所以,筆者根據(jù)對(duì)傳統(tǒng)操作系統(tǒng)的認(rèn)識(shí)方法,粗淺地把對(duì)Spring框架的實(shí)現(xiàn)劃分為核心、組件和應(yīng)用這三個(gè)基本層次,通過(guò)對(duì)這三個(gè)層次中的一些主要特性的實(shí)現(xiàn)來(lái)剖析Spring的工作原理和運(yùn)作機(jī)制。同時(shí),也把這樣的認(rèn)識(shí)邏輯用來(lái)組織本書(shū)中需要闡述的內(nèi)容。
在這樣的層次劃分中,首先看到的是對(duì)IoC容器和AOP這兩個(gè)核心模塊的工作原理的分析,它們都是Spring平臺(tái)實(shí)現(xiàn)的核心部分;同時(shí),它們也是Spring的其他模塊實(shí)現(xiàn)的基礎(chǔ)。雖然大多數(shù)開(kāi)發(fā)者都只是在此基礎(chǔ)上進(jìn)行相關(guān)的配置和使用外部功能,但是深入理解這兩個(gè)核心模塊的工作原理和運(yùn)作機(jī)制對(duì)于我們更好地使用Spring進(jìn)行開(kāi)發(fā)是至關(guān)重要的。因?yàn)镾pring簡(jiǎn)化Java EE開(kāi)發(fā)是通過(guò)對(duì)POJO開(kāi)發(fā)提供支持來(lái)實(shí)現(xiàn)的。Spring通過(guò)為基于POJO的開(kāi)發(fā)模式提供支持,從而讓?xiě)?yīng)用開(kāi)發(fā)與復(fù)雜的Java EE服務(wù)實(shí)現(xiàn)解耦,并由此通過(guò)提高單元測(cè)試覆蓋率(也就是應(yīng)用系統(tǒng)的可測(cè)試性)來(lái)有效地提高Spring應(yīng)用的開(kāi)發(fā)質(zhì)量。在這樣的開(kāi)發(fā)場(chǎng)景下,需要把為POJO提供支持的各種Java EE服務(wù)支持抽象到Spring應(yīng)用平臺(tái)中去,并將其封裝起來(lái)。具體地說(shuō),這一系列的封裝工作在Spring及其應(yīng)用實(shí)現(xiàn)中離不開(kāi)IoC容器和AOP這兩個(gè)核心模塊的支持,它們很大程度上體現(xiàn)了Spring作為應(yīng)用開(kāi)發(fā)平臺(tái)的核心價(jià)值。它們的實(shí)現(xiàn)是Rod Johnson在他的另外一本著作 Expert One-on-One J2EE Development without EJB中,所提到“Without EJB設(shè)計(jì)思想”的具體體現(xiàn),同時(shí),也深刻地體現(xiàn)了Spring背后的設(shè)計(jì)理念。
其次,在IoC容器和AOP這兩個(gè)核心模塊的支持下,Spring為了簡(jiǎn)化Java EE開(kāi)發(fā),為應(yīng)用開(kāi)發(fā)提供了許多現(xiàn)成的用戶態(tài)系統(tǒng)組件,比如事務(wù)處理、Web MVC、DBC、O/R映射、遠(yuǎn)端調(diào)用等,通過(guò)這些系統(tǒng)組件為企業(yè)應(yīng)用服務(wù)的實(shí)現(xiàn)提供驅(qū)動(dòng)支持。這些由Spring或者其生態(tài)系統(tǒng)(其本身、子項(xiàng)目或者社區(qū))提供的、類似于驅(qū)動(dòng)模塊般的系統(tǒng)組件是開(kāi)發(fā)應(yīng)用時(shí)經(jīng)常會(huì)用到的Java EE服務(wù)抽象。Spring讓用戶可以用POJO來(lái)開(kāi)發(fā)具體的應(yīng)用,而這些應(yīng)用往往需要Java EE服務(wù)的有力支撐。通過(guò)使用Spring提供的這些類似于驅(qū)動(dòng)組件的中間產(chǎn)品,通過(guò)這一層Java EE服務(wù)的抽象,用戶可以通過(guò)使用簡(jiǎn)單的開(kāi)發(fā)接口或者應(yīng)用模板很方便地使用各種Java EE服務(wù)和靈活地選取提供這些服務(wù)的各種不同的具體實(shí)現(xiàn)方案。比如,可以在各種第三方開(kāi)源軟件或者商業(yè)產(chǎn)品中自由地選擇。
Spring作為一個(gè)開(kāi)源項(xiàng)目,它本身就是一個(gè)開(kāi)放的生態(tài)系統(tǒng)。對(duì)于與Spring相關(guān)的一些項(xiàng)目,可以把它們看作某個(gè)領(lǐng)域的用戶應(yīng)用,因?yàn)樗鼈兣cSpring的實(shí)現(xiàn)緊密相關(guān);或者,它們本身就作為Spring框架的應(yīng)用案例,體現(xiàn)了許多使用Spring的技巧。這些都是我們開(kāi)發(fā)應(yīng)用的理想?yún)⒖迹热鏏CEGI安全性框架和petclinic應(yīng)用案例。一方面,可以把這些實(shí)現(xiàn)作為應(yīng)用的一個(gè)基本方案加以裁剪,以滿足特定領(lǐng)域的需求;另一方面,通過(guò)剖析這些應(yīng)用,可以為應(yīng)用開(kāi)發(fā)提供很好的參考,提高開(kāi)發(fā)效率。
從更深層次的技術(shù)層面上來(lái)看,因?yàn)镾pring是基于Java語(yǔ)言的應(yīng)用平臺(tái),如果我們能夠?qū)ψ鳛镾pring的運(yùn)行環(huán)境的Java計(jì)算模型(比如JVM的實(shí)現(xiàn)原理)有一些了解,將會(huì)加深我們對(duì)Spring實(shí)現(xiàn)原理的理解。反射機(jī)制、代理類、字節(jié)碼技術(shù)等這些JVM特性都是在Spring實(shí)現(xiàn)中會(huì)涉及的一些Java計(jì)算環(huán)境的底層技術(shù)。一般的應(yīng)用開(kāi)發(fā)人員可能不會(huì)直接從事與JVM底層實(shí)現(xiàn)相關(guān)的工作,但是這些計(jì)算環(huán)境的底層知識(shí)對(duì)我們深入理解Spring是不可缺少的。
在本書(shū)的寫(xiě)作過(guò)程中,VMware公司收購(gòu)了Spring的運(yùn)營(yíng)者Spring Source。此次商業(yè)收購(gòu)一方面反映了開(kāi)源軟件中蘊(yùn)含著的巨大商業(yè)價(jià)值,另一方面反映了Spring的發(fā)展趨勢(shì):與云計(jì)算融合,以及Spring為自己規(guī)劃的云計(jì)算戰(zhàn)略—成為PaaS(Platform As a Service)服務(wù)的有力競(jìng)爭(zhēng)者。在云計(jì)算這個(gè)全新的計(jì)算環(huán)境中,如何在發(fā)揮Spring在企業(yè)級(jí)應(yīng)用開(kāi)發(fā)中已經(jīng)具備的優(yōu)勢(shì)的基礎(chǔ)上,為云計(jì)算應(yīng)用的開(kāi)發(fā)提供高可靠性、高可用性、高可擴(kuò)展性和高性能的應(yīng)用平臺(tái),是Spring團(tuán)隊(duì)面臨的全新挑戰(zhàn)。Spring在這個(gè)嶄新領(lǐng)域的雄心和作為讓我們充滿好奇和期待,我們拭目以待!
閑話說(shuō)了這么多,很多讀者可能已經(jīng)有些迫不及待了,也許只有對(duì)Spring的實(shí)現(xiàn)身臨其境地接觸才是真實(shí)的,這里太多的文字已經(jīng)成為一種累贅。本書(shū)將帶領(lǐng)你到Spring的核心實(shí)現(xiàn)這個(gè)茂密而又充滿生機(jī)的源代碼叢林中去大膽地探尋和小心地求證。在這里,你會(huì)驚奇地發(fā)現(xiàn):這個(gè)過(guò)程就像是閱讀優(yōu)美的散文或情節(jié)跌宕起伏的小說(shuō)一樣,是與開(kāi)源軟件開(kāi)發(fā)者以及開(kāi)發(fā)者社區(qū)的一種暢快淋漓的交流和對(duì)話,讓人如癡如醉。
本書(shū)面向的讀者
? 學(xué)習(xí)Java語(yǔ)言和Java EE技術(shù)的中高級(jí)開(kāi)發(fā)者
Spring是使用Java語(yǔ)言實(shí)現(xiàn)的,很多功能的源碼實(shí)現(xiàn)都極其優(yōu)秀,非常具有研究和參考價(jià)值。對(duì)這部分讀者來(lái)說(shuō),不僅可以從本書(shū)中了解到Spring的實(shí)現(xiàn)原理,而且還能通過(guò)Spring的源代碼,掌握一流的Java編碼技巧和Java EE開(kāi)發(fā)技術(shù)。
? Spring應(yīng)用開(kāi)發(fā)人員
如果要利用Spring進(jìn)行高級(jí)應(yīng)用開(kāi)發(fā),抑或是相關(guān)的優(yōu)化和擴(kuò)展工作,僅僅掌握Spring的配置和基本使用是遠(yuǎn)遠(yuǎn)不夠的,必須要對(duì)Spring框架的設(shè)計(jì)思想、架構(gòu)和運(yùn)作機(jī)制有一定的了解。對(duì)這部分讀者而言,本書(shū)將帶領(lǐng)他們?nèi)媪私釹pring的實(shí)現(xiàn)原理,從而加深對(duì)Spring框架的理解,提高自己的開(kāi)發(fā)水平。同時(shí),本書(shū)可以作為他們定制和擴(kuò)展Spring框架的參考資料。
? 開(kāi)源軟件愛(ài)好者
Spring是開(kāi)源軟件中的佼佼者,它在實(shí)現(xiàn)的過(guò)程中吸收了很多開(kāi)源領(lǐng)域的優(yōu)秀思想,同時(shí)也有很多值得其他開(kāi)源軟件學(xué)習(xí)的創(chuàng)新。尤為值得一提的是,本書(shū)分析Spring源代碼的方式也許值得所有想分析源代碼的愛(ài)好者們學(xué)習(xí)和借鑒。通過(guò)閱讀本書(shū),這部分讀者不僅能領(lǐng)略到開(kāi)源軟件的優(yōu)秀思想,而且還能掌握分析源代碼的方法和技巧,從而進(jìn)一步提高使用開(kāi)源軟件的效率和質(zhì)量。
? 平臺(tái)開(kāi)發(fā)人員和架構(gòu)師
前面已經(jīng)反復(fù)強(qiáng)調(diào),Spring的設(shè)計(jì)思想、架構(gòu)和實(shí)現(xiàn)都非常優(yōu)秀,是平臺(tái)開(kāi)發(fā)人員和架構(gòu)師們不可多得的參考資料。
- Java 開(kāi)發(fā)從入門(mén)到精通(第2版)
- Python數(shù)據(jù)分析入門(mén)與實(shí)戰(zhàn)
- Python Deep Learning
- Python Tools for Visual Studio
- Magento 1.8 Development Cookbook
- C++從入門(mén)到精通(第5版)
- 零基礎(chǔ)學(xué)C語(yǔ)言第2版
- 運(yùn)維前線:一線運(yùn)維專家的運(yùn)維方法、技巧與實(shí)踐
- Django 5企業(yè)級(jí)Web應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)(視頻教學(xué)版)
- 小程序從0到1:微信全棧工程師一本通
- 高效使用Greenplum:入門(mén)、進(jìn)階與數(shù)據(jù)中臺(tái)
- Mastering ASP.NET Core 2.0
- PHP Microservices
- Professional JavaScript
- 大話程序員:從入門(mén)到優(yōu)秀全攻略