詳細(xì)介紹Spring的核心
Spring的核心是個輕量級容器(container),實現(xiàn)了IoC(Inversion of Control)模式的容器,Spring的目標(biāo)是實現(xiàn)一個全方位的整合框架,在Spring框架下實現(xiàn)多個子框架的組合,這些子框架之間彼此可以獨立,也可以使用其它的框架方案加以替代,Spring希望提供one-stop shop的框架整合方案 。
Spring不會特別去提出一些子框架來與現(xiàn)有的OpenSource框架競爭,除非它覺得所提出的框架夠新夠好,例如Spring有自己的 MVC框架方案,因為它覺得現(xiàn)有的MVC方案有很多可以改進(jìn)的地方,但它不強(qiáng)迫您使用它提供的方案,您可以選用您所希望的框架來取代其子框架,例如您仍可以在Spring中整合您的Struts框架 。
Spring的核心概念是IoC,IoC的抽象概念是「依賴關(guān)系的轉(zhuǎn)移」,像是「高層模組不應(yīng)該依賴低層模組,而是模組都必須依賴于抽象」是 IoC的一種表現(xiàn),「實現(xiàn)必須依賴抽象,而不是抽象依賴實現(xiàn)」也是IoC的一種表現(xiàn),「應(yīng)用程序不應(yīng)依賴于容器,而是容器服務(wù)于應(yīng)用程序」也是IoC的一種表現(xiàn)。
Spring簡介
關(guān)于Spring Framework,今年夏天你可能已經(jīng)聽見很多的議論。在本文中,我將試圖解釋Spring能完成什么,和我怎么會認(rèn)為它能幫助你開發(fā)J2EE應(yīng)用程序。
另一framework,你可能正在想“不過是另外一個的framework”。當(dāng)已經(jīng)有許多開放源代碼(和專有) J2EE framework時,為什么你應(yīng)該費心讀這篇文章,或下載Spring Framework?
我相信Spring是獨特的,因為若干個原因: 它定位的領(lǐng)域是許多其他流行的framework沒有的。Spring關(guān)注提供一種方法管理你的業(yè)務(wù)對象。
Spring是全面的和模塊化的。Spring有分層的體系結(jié)構(gòu),這意味著你能選擇使用它孤立的任何部分,它的架構(gòu)仍然是內(nèi)在穩(wěn)定的。因此從你的學(xué)習(xí)中,你可得到最大的價值。例如,你可能選擇僅僅使用Spring來簡單化JDBC的使用,或用來管理所有的業(yè)務(wù)對象。 它的設(shè)計從底部幫助你編寫易于測試的代碼。Spring是用于測試驅(qū)動工程的理想的framework。Spring對你的工程來說,它不需要一個以上的framework。
Spring是潛在地一站式解決方案,定位于與典型應(yīng)用相關(guān)的大部分基礎(chǔ)結(jié)構(gòu)。它也涉及到其他framework沒有考慮到的內(nèi)容。盡管它僅僅是一個從2003年2月才開始的開源工程,但Spring有較長的歷史根基。這個開源工程是起源自我在2002年后期出版的《Expert One-on-One J2EE設(shè)計與開發(fā)》書中的基礎(chǔ)代碼。這本書展示了Spring背后的基礎(chǔ)架構(gòu)。然而,這個基礎(chǔ)架構(gòu)的概念要追溯到2000年的早些時候,并且反映了我為一系列成功的商業(yè)工程開發(fā)基礎(chǔ)結(jié)構(gòu)的經(jīng)驗。從2003年1月,Spring已經(jīng)落戶于SourceForge上?,F(xiàn)在有10個開發(fā)人員,其中6是高度投入的積極分子。
Spring的架構(gòu)性的好處
◆Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發(fā)現(xiàn)Spring關(guān)注了遺留下的問題。
◆Spring能消除在許多工程上對Singleton的過多使用。根據(jù)我的經(jīng)驗,這是一個主要的問題,它減少了系統(tǒng)的可測試性和面向?qū)ο筇匦浴?BR>◆Spring 能消除使用各種各樣格式的屬性定制文件的需要,在整個應(yīng)用和工程中,可通過一種一致的方法來進(jìn)行配置。曾經(jīng)感到迷惑,一個特定類要查找迷幻般的屬性關(guān)鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。 Spring能通過接口而不是類促進(jìn)好的編程習(xí)慣,減少編程代價到幾乎為零。
◆Spring被設(shè)計為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對象沒有依賴于Spring。
◆使用Spring構(gòu)建的應(yīng)用程序易于單元測試。
◆Spring能使EJB的使用成為一個實現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇。你能選擇用POJOs或local EJBs來實現(xiàn)業(yè)務(wù)接口,卻不會影響調(diào)用代碼。
◆Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適于許多web應(yīng)用。例如,Spring能使用AOP提供聲明性事務(wù)而不通過使用EJB容器,如果你僅僅需要與單個的數(shù)據(jù)庫打交道,甚至不需要JTA實現(xiàn)。
◆Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R mapping產(chǎn)品(如Hibernate)。
◆Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。
Spring能做什么
Spring提供許多功能,在此我將快速地依次展示其各個主要方面。首先,讓我們明確Spring范圍。盡管Spring覆蓋了許多方面,但我們已經(jīng)有清楚的概念,它什么應(yīng)該涉及和什么不應(yīng)該涉及。
Spring的主要目的是使J2EE易用和促進(jìn)好編程習(xí)慣。
Spring不重新開發(fā)已有的東西。因此,在Spring中你將發(fā)現(xiàn)沒有日志記錄的包,沒有連接池,沒有分布事務(wù)調(diào)度。這些均有開源項目提供(例如 Commons Logging 用來做所有的日志輸出,或Commons DBCP用來作數(shù)據(jù)連接池),或由你的應(yīng)用程序服務(wù)器提供。因為同樣的的原因,我們沒有提供O/R mapping層,對此,已有有好的解決辦法如Hibernate和JDO。
Spring的目標(biāo)是使已存在的技術(shù)更加易用。例如,盡管我們沒有底層事務(wù)協(xié)調(diào)處理,但我們提供了一個抽象層覆蓋了JTA或任何其他的事務(wù)策略。
Spring 沒有直接和其他的開源項目競爭,除非我們感到我們能提供新的一些東西。例如,象許多開發(fā)人員,我們從來沒有為Struts高興過,并且感到在MVC web framework中還有改進(jìn)的余地。在某些領(lǐng)域,例如輕量級的 IoC容器和AOP框架,Spring有直接的競爭,但是在這些領(lǐng)域還沒有已經(jīng)較為流行的解決方案。(Spring在這些區(qū)域是開路先鋒。)
Spring也得益于內(nèi)在的一致性。
所有的開發(fā)者都在唱同樣的的贊歌,基礎(chǔ)想法依然是Expert One-on-One J2EE設(shè)計與開發(fā)的那些。
并且我們已經(jīng)能夠使用一些主要的概念,例如倒置控制,來處理多個領(lǐng)域。
Spring在應(yīng)用服務(wù)器之間是可移植的。
當(dāng)然保證可移植性總是一次挑戰(zhàn),但是我們避免任何特定平臺或非標(biāo)準(zhǔn)化,并且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應(yīng)用服務(wù)器上的用戶。
Spring的核心即是個IoC/DI的容器,它可以幫程序設(shè)計人員完成組件之間的依賴關(guān)系注入,使得組件之間的依賴達(dá)到最小,進(jìn)而提高組件的重用性,Spring是個低侵入性(invasive)的框架,Spring中的組件并不會意識到它正置身于Spring中,這使得組件可以輕易的從框架中脫離,而幾乎不用任何的修改,反過來說,組件也可以簡單的方式加入至框架中,使得組件甚至框架的整合變得容易。
Spring最為人重視的另一方面是支持 AOP(Aspect-Oriented Programming),然而AOP框架只是Spring支持的一個子框架,說Spring框架是AOP框架并不是一件適當(dāng)?shù)拿枋?,人們對于新奇?AOP關(guān)注映射至Spring上,使得人們對于Spring的關(guān)注集中在它的AOP框架上,雖然有所誤解,但也突顯了Spring的另一個令人關(guān)注的特色。
Spring也提供MVC Web框架的解決方案,但您也可以將自己所熟悉的MVC Web框架與Spring解合,像是Struts、Webwork等等,都可以與Spring整合而成為進(jìn)用于自己的解決方案。Spring也提供其它方面的整合,像是持久層的整合如JDBC、O/R Mapping工具(Hibernate、iBATIS)、事務(wù)處理等等,Spring作了對多方面整合的努力,故說Spring是個全方位的應(yīng)用程序框架。
想要入門Spring,對于IoC/DI的了解是必要的。如果您想了解Spring的整體概念,可以看看Expert One on one J2EE Development Without EJB這本書,Spring的前身是由該作者的前一本書Expert One on one J2EE Design and Development中的一個實際程序開始,Spring本身是J2EE的一個輕量級容器解決方案,從這本書了解J2EE程序設(shè)計的考慮也是個不錯的基礎(chǔ)建構(gòu)方式。對于Expert One on one J2EE Development Without EJB這本書,如果您想了解Spring,可以看chapter 7、chapter 13。
【編輯推薦】