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

1.2 Spring的設(shè)計(jì)目標(biāo)

如果我們要簡要地描述Spring的設(shè)計(jì)目標(biāo),可以這么說,Spring為開發(fā)者提供的是一個一站式的輕量級應(yīng)用開發(fā)框架(平臺)。作為平臺,Spring抽象了我們在許多應(yīng)用開發(fā)中遇到的共性問題;同時,作為一個輕量級的應(yīng)用開發(fā)框架,Spring和傳統(tǒng)的J2EE開發(fā)相比,有其自身的特點(diǎn)。通過這些自身的特點(diǎn),Spring充分體現(xiàn)了它的設(shè)計(jì)理念:在Java EE的應(yīng)用開發(fā)中,支持POJO和使用JavaBean的開發(fā)方式,使應(yīng)用面向接口開發(fā),充分支持OO(面向?qū)ο螅┑脑O(shè)計(jì)方法。

比如,在Java EE應(yīng)用開發(fā)中,傳統(tǒng)的EJB開發(fā)需要依賴按照J(rèn)2EE規(guī)范實(shí)現(xiàn)的J2EE應(yīng)用服務(wù)器。我們的應(yīng)用在設(shè)計(jì),特別是實(shí)現(xiàn)時,往往需要遵循一系列的接口標(biāo)準(zhǔn),才能夠在應(yīng)用服務(wù)器的環(huán)境中得到測試和部署。這種開發(fā)方式,使應(yīng)用在可測試性和部署上都會受到一些影響。Spring的設(shè)計(jì)理念采用了相對EJB而言的輕量級開發(fā)思想,即使用POJO的開發(fā)方式,只需要使用簡單的Java對象或者JavaBean就能進(jìn)行Java EE開發(fā),這樣開發(fā)的入門、測試、應(yīng)用部署都得到了簡化。

另一方面,在我們的應(yīng)用開發(fā)中,往往會涉及復(fù)雜的對象耦合關(guān)系,如果在Java代碼中處理這些耦合關(guān)系,對代碼的維護(hù)性和應(yīng)用擴(kuò)展性會帶來許多不便。而如果使用Spring作為應(yīng)用開發(fā)平臺,通過使用Spring的IoC容器,可以對這些耦合關(guān)系(對Java代碼而言)實(shí)現(xiàn)一個文本化、外部化的工作,也就是說,通過一個或幾個XML文件,我們就可以方便地對應(yīng)用對象的耦合關(guān)系進(jìn)行瀏覽、修改和維護(hù),這樣,可以在很大程度上簡化應(yīng)用開發(fā)。同時,通過IoC容器實(shí)現(xiàn)的依賴反轉(zhuǎn),把依賴關(guān)系的管理從Java對象中解放出來,交給了IoC容器(或者說是Spring框架)來完成,從而完成了對象之間的關(guān)系解耦:原來的對象-對象的關(guān)系,轉(zhuǎn)化為對象-IoC容器-對象的關(guān)系,通過這種對象-IoC容器-對象的關(guān)系,更體現(xiàn)出IoC容器對應(yīng)用的平臺作用。

作為應(yīng)用平臺,Spring是怎樣實(shí)現(xiàn)它的平臺功能的呢?我們知道,在Java企業(yè)應(yīng)用中,使用J2EE應(yīng)用服務(wù)器可以開發(fā)出符合企業(yè)信息化需求的軟件應(yīng)用,其實(shí),在這種應(yīng)用場景下,可以將J2EE應(yīng)用服務(wù)器看成是Java EE應(yīng)用開發(fā)的平臺,只是這個平臺的設(shè)計(jì)是從J2EE的技術(shù)規(guī)范出發(fā)的,所以對使用者來說,對技術(shù)的理解和要求相對較高。對于Spring來說,它的定位也是在Java企業(yè)應(yīng)用中,與我們熟知的J2EE服務(wù)器一樣,起到一個應(yīng)用平臺和開發(fā)框架的作用;同時希望能夠集成管理企業(yè)應(yīng)用需要用到的資源,以及為企業(yè)應(yīng)用開發(fā)提供平臺支持,但因?yàn)樵O(shè)計(jì)的出發(fā)點(diǎn)不同,所以在推廣和使用上更有優(yōu)勢。

作為應(yīng)用平臺,Spring與UNIX/Windows這樣傳統(tǒng)意義的操作系統(tǒng)在計(jì)算機(jī)系統(tǒng)中的作用類似,即作為用戶和機(jī)器之間的平臺,同時也為用戶使用底層的機(jī)器資源提供了應(yīng)用開發(fā)環(huán)境。不同點(diǎn)只在于,操作系統(tǒng)關(guān)心的是對存儲、計(jì)算、通信、外圍設(shè)備等物理資源的管理,并在管理這些資源的基礎(chǔ)上,為用戶提供一個統(tǒng)一的服務(wù)接口;而對于像Spring這樣的Java EE企業(yè)應(yīng)用開發(fā)而言,其關(guān)心的是一些企業(yè)應(yīng)用資源的使用,比如數(shù)據(jù)的持久化、數(shù)據(jù)集成、事務(wù)處理、消息中間件、Web2.0應(yīng)用、分布式計(jì)算等對高效可靠處理企業(yè)數(shù)據(jù)方法的技術(shù)抽象。具體來說,在J2EE開發(fā)中,EJB提供了一種模式,而Spring提供了另一種POJO的開發(fā)模式,雖然開發(fā)模式不同(也就是使用具體資源的模式不同,但出發(fā)點(diǎn)卻都是一樣的),但其整體地位和前面提到的操作系統(tǒng)有不少可以類比的地方。

從理解應(yīng)用開發(fā)和應(yīng)用平臺兩者關(guān)系的角度出發(fā),可以讓我們換一種視角來體會Spring的設(shè)計(jì)理念,筆者認(rèn)為,在對Spring的內(nèi)部設(shè)計(jì)進(jìn)行分析時,也可以依據(jù)對傳統(tǒng)操作系統(tǒng)的認(rèn)知方法(算是找一個大家都熟知的參考模型來幫助我們理解Spring吧),在設(shè)計(jì)上把Spring劃分為核心、組件和應(yīng)用3個基本的層次。希望這種劃分能夠幫助大家在深入了解Spring設(shè)計(jì)的時候,對一些具體的模塊有一個大致的定位和參考。

在這樣的層次劃分中,我們首先會看到,Spring體系的核心,類似操作系統(tǒng)的Kernel,即IoC容器和AOP模塊。對于操作系統(tǒng)的Kernel來說,進(jìn)程調(diào)度器的設(shè)計(jì)是其關(guān)鍵部分,通過進(jìn)程調(diào)度器,一方面使用“進(jìn)程”這個概念來抽象物理的計(jì)算資源,另一方面,可以通過調(diào)度算法的設(shè)計(jì)來實(shí)現(xiàn)對計(jì)算資源的高效使用。對Spring來說,也是一樣的,一方面,它通過IoC容器來管理POJO對象,以及它們相互之間的耦合關(guān)系,使企業(yè)的信息(數(shù)據(jù))資源可以用簡單的Java語言來抽象和描述;另一方面,可以通過AOP,以動態(tài)和非侵入式的方式來增強(qiáng)服務(wù)的功能。所以,我們可以把IoC容器和AOP模塊看做Spring的Kernel,是平臺實(shí)現(xiàn)的核心部分。作為核心,它們代表了最為基礎(chǔ)的底層抽象,同時也是Spring其他模塊實(shí)現(xiàn)的基礎(chǔ)。雖然作為使用者的我們大多數(shù)是開發(fā)者,只是在這兩個模塊的基礎(chǔ)上進(jìn)行相關(guān)的配置和使用,但是如果能夠了解這兩個核心模塊的設(shè)計(jì)和實(shí)現(xiàn),就像了解Linux核心的實(shí)現(xiàn)一樣,毫無疑問,會讓我們對整個平臺的了解更上一層樓,對平臺的認(rèn)識也更為全面和系統(tǒng)。

另外,在Spring體系中,我們還會看到,在IoC和AOP這兩個核心模塊的支持下,Spring簡化了Java EE所進(jìn)行的開發(fā)。這種簡化是指,我們能夠不在EJB這么厚重的環(huán)境中使用Java EE的基本服務(wù)—為應(yīng)用開發(fā)提供了許多即開即用的系統(tǒng)組件和服務(wù),這些服務(wù)涵蓋了Java EE各個基本服務(wù),對于其他的服務(wù),也可以根據(jù)使用情況動態(tài)擴(kuò)展到Spring體系中(只要依據(jù)IoC和AOP所約定好的特定模式)。基本說來,Spring體系中已經(jīng)可以包括我們在應(yīng)用開發(fā)中經(jīng)常用到的許多服務(wù)了,比如事務(wù)處理、Web MVC、JDBC、ORM、遠(yuǎn)端調(diào)用,從對用戶的價值上來說,這些服務(wù)相對來說是不可忽視的,因?yàn)榫退阌辛艘粋€Kernel,打個比方,如果Linux沒有實(shí)現(xiàn)許多驅(qū)動,Linux這個操作系統(tǒng)對用戶來說也是沒有價值的。設(shè)想一下,對于一個用戶,只有一個光禿禿的Linux Kernel拿到手里,顯卡驅(qū)動沒有,鍵盤和鼠標(biāo)的驅(qū)動沒有,桌面系統(tǒng)沒有,這樣的系統(tǒng)能使用嗎?這樣的平臺對一般的用戶來說有價值嗎?同樣的道理,對Spring來說,有了IoC和AOP就相當(dāng)于有了Spring的Kernel,但如果沒有我們前面提到的那些即開即用的服務(wù),Spring的應(yīng)用和推廣還會遇到很大的障礙。不過值得慶幸的是,Spring通過社區(qū)和自己的努力,提供了這些看起來不起眼,卻對推廣起著關(guān)鍵作用的部分,從而構(gòu)建出一個豐富的生態(tài)系統(tǒng)。也許,這就暗示了interface21和Spring項(xiàng)目之間重要的不同之處。由此可以看到,這些由Spring或者其生態(tài)系統(tǒng)提供的,類似于驅(qū)動模塊的系統(tǒng)組件,也是Spring平臺的有機(jī)組成部分,通過這部分組件提供了很多簡單的即開即用的Java EE服務(wù)抽象,從而使應(yīng)用在通過POJO來進(jìn)行具體開發(fā)時,得到Java EE服務(wù)的有力支持,使應(yīng)用可以更關(guān)注應(yīng)用的領(lǐng)域問題,更關(guān)注業(yè)務(wù)邏輯。同時,由于Spring使用IoC容器和AOP這樣的核心模塊來構(gòu)建這些服務(wù)抽象和應(yīng)用,它們本身的松耦合設(shè)計(jì)理念,可以讓應(yīng)用通過使用簡單的開發(fā)接口或現(xiàn)成的應(yīng)用模板,就可以方便地使用這些Java EE服務(wù)。不但如此,由于這些服務(wù)是通過IoC容器和AOP核心模塊來提供的,對用戶而言,綁定的是IoC容器和AOP模塊,也就是說綁定的是IoC容器/AOP模塊的使用接口,而不是綁定具體的Java EE服務(wù),也為應(yīng)用靈活地選取不同的服務(wù)實(shí)現(xiàn)提供了基礎(chǔ)。比如,根據(jù)應(yīng)用需求,用戶可以選擇Hibernate作為ORM工具,也可以使用iBatis,還可以使用其他的類似工具。這些不同工具和底層服務(wù)具體實(shí)現(xiàn)的選擇都不影響應(yīng)用的架構(gòu)設(shè)計(jì),這也體現(xiàn)了Spring的設(shè)計(jì)理念—面向接口開發(fā)而不依賴于具體的產(chǎn)品實(shí)現(xiàn)。

作為一個開源項(xiàng)目,就像Linux一樣,Spring本身也依靠開源社區(qū)的力量,形成了一個開放的生態(tài)系統(tǒng),開源的特性也深深影響了Spring的體系設(shè)計(jì)。在Spring的發(fā)展中,其本身就吸收了不少社區(qū)的好項(xiàng)目,比如Spring的Security框架就是來源于一個社區(qū)貢獻(xiàn)Acegi。這個項(xiàng)目原意是為Spring應(yīng)用設(shè)計(jì)的一個安全框架,讓Spring應(yīng)用更方便地處理一些安全性的問題,但隨著應(yīng)用的推廣,慢慢也被吸收到Spring項(xiàng)目中去,成為一個Spring的子項(xiàng)目,雖然不是Spring Framework的一個部分,但也是在應(yīng)用開發(fā)中經(jīng)常使用到的。另外,隨著技術(shù)和應(yīng)用的發(fā)展,Spring也在對其他的技術(shù)提供支持,比如對Android移動應(yīng)用開發(fā)的支持,對Adobe Flex前端應(yīng)用的支持,對OSGi應(yīng)用的支持等,這些都讓以Spring為基礎(chǔ)構(gòu)建的Spring生態(tài)圈更加繁榮。

在對Spring的應(yīng)用過程中,我們沒有看到許多在J2EE開發(fā)中經(jīng)常出現(xiàn)的技術(shù)規(guī)范,相反的是,在Spring的實(shí)現(xiàn)中,我們直接看到了許多Java虛擬機(jī)特性的使用,這和Spring提倡的POJO的開發(fā)理念是密不可分的,了解這一點(diǎn),也可以幫助我們加深對Spring設(shè)計(jì)理念的認(rèn)識。在Spring的設(shè)計(jì)中,實(shí)現(xiàn)AOP就采用了多種方式,比如它集成了AspectJ框架,同時也有ProxyFactory這種代理工廠的模式,而在代理工廠的實(shí)現(xiàn)中,既有直接使用JVM動態(tài)代理Proxy的實(shí)現(xiàn),也有使用第三方代理類庫CGLIB的實(shí)現(xiàn)。在設(shè)計(jì)上,這些特點(diǎn)很好地展示了Spring循證式開發(fā)的實(shí)用主義設(shè)計(jì)理念,這些理念和實(shí)現(xiàn),同時也是我們開發(fā)Java EE應(yīng)用很好的參考。

主站蜘蛛池模板: 沾化县| 潜山县| 南通市| 抚宁县| 安徽省| 镇雄县| 安龙县| 石嘴山市| 南汇区| 连平县| 宜川县| 麦盖提县| 庄河市| 通城县| 县级市| 乌海市| 获嘉县| 文登市| 望江县| 义乌市| 新河县| 白朗县| 儋州市| 汶上县| 磐石市| 寿阳县| 太白县| 旅游| 紫阳县| 黄陵县| 怀宁县| 青海省| 博罗县| 永清县| 松潘县| 阿尔山市| 谢通门县| 天长市| 阳江市| 临城县| 乐昌市|