Spring簡介
Spring是一個開源框架,它由Rod Johnson創建。它是為了解決企業套用開發的複雜性而創建的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限於伺服器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java套用都可以從Spring中受益。
• 目的:解決企業套用開發的複雜性
• 功能:使用基本的JavaBean代替EJB,並提供了更多的企業套用功能
• 範圍:任何Java套用
簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。
■ 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個大小只有1MB多的JAR檔案里發布。並且Spring所需的處理開銷也是微不足道的。此外,Spring是非侵入式的:典型地,Spring套用中的對象不依賴於Spring的特定類。
■ 控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當套用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你可以認為IoC與JNDI相反——不是對象從容器中查找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
■ 面向切面——Spring提供了面向切面編程的豐富支持,允許通過分離套用的業務邏輯與系統級服務(例如審計(auditing)和事務()管理)進行內聚性的開發。套用對象只實現它們應該做的——完成業務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支持。
■ 容器——Spring包含並管理套用對象的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個bean如何被創建——基於一個可配置原型(prototype),你的bean可以創建一個單獨的實例或者每次需要時都生成一個新的實例——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
■ 框架——Spring可以將簡單的組件配置、組合成為複雜的套用。在Spring中,套用對象被聲明式地組合,典型地是在一個XML檔案里。Spring也提供了很多基礎功能(事務管理、持久化框架集成等等),將套用邏輯的開發留給了你。
所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也為Spring中的各種模組提供了基礎支持。
關於Spring Framework,今年夏天你可能已經聽見很多的議論。在本文中,我將試圖解釋Spring能完成什麼,和我怎么會認為它能幫助你開發J2EE應用程式。
另一framework?
你可能正在想“不過是另外一個的framework”。當已經有許多開放原始碼(和專有) J2EE framework時,為什麼你應該費心讀這篇文章,或下載Spring Framework?
我相信Spring是獨特的,因為若干個原因:
. 它定位的領域是許多其他流行的framework沒有的。Spring關注提供一種方法管理你的業務對象。
. Spring是全面的和模組化的。Spring有分層的體系結構,這意味著你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。因此從你的學習中,你可得到最大的價值。例如,你可能選擇僅僅使用Spring來簡單化JDBC的使用,或用來管理所有的業務對象。
. 它的設計從底部幫助你編寫易於測試的代碼。Spring是用於測試驅動工程的理想的framework。
Spring對你的工程來說,它不需要一個以上的framework。Spring是潛在地一站式解決方案,定位於與典型套用相關的大部分基礎結構。它也涉及到其他framework沒有考慮到的內容。
儘管它僅僅是一個從2003年2月才開始的開源工程,但Spring有較長的歷史根基。這個開源工程是起源自我在2002年後期出版的《Expert One-on-One J2EE設計與開發》書中的基礎代碼。這本書展示了Spring背後的基礎架構。然而,這個基礎架構的概念要追溯到2000年的早些時候,並且反映了我為一系列成功的商業工程開發基礎結構的經驗。
從2003年1月,Spring已經落戶於SourceForge上。現在有10個開發人員,其中6是高度投入的積極分子。
Spring的架構性的好處
在我們進入細節以前,讓我們看一下Spring可以給一個工程帶來的一些好處:
. Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發現Spring關注了遺留下的問題,。
. Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的可測試性和面向對象特性。
. Spring能消除使用各種各樣格式的屬性定製檔案的需要,在整個套用和工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,為此不得不讀javadoc乃至源編碼嗎?有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。
. Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。
. Spring被設計為讓使用它創建的套用儘可能少的依賴於他的APIs。在Spring套用中的大多數業務對象沒有依賴於Spring。
. 使用Spring構建的應用程式易於單元測試。
. Spring能使EJB的使用成為一個實現選擇,而不是套用架構的必然選擇。你能選擇用POJOs或local EJBs來實現業務接口,卻不會影響調用代碼。
. Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web套用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。
. Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。
Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。
Spring能做什麼?
Spring提供許多功能,在此我將快速地依次展示其各個主要方面。
任務描述:
首先,讓我們明確Spring範圍。儘管Spring覆蓋了許多方面,但我們已經有清楚的概念,它什麼應該涉及和什麼不應該涉及。
Spring的主要目的是使J2EE易用和促進好編程習慣。
Spring不重新開發已有的東西。因此,在Spring中你將發現沒有日誌記錄的包,沒有連線池,沒有分布事務調度。這些均有開源項目提供(例如Commons Logging 用來做所有的日誌輸出,或Commons DBCP用來作數據連線池),或由你的應用程式服務器提供。因為同樣的的原因,我們沒有提供O/R mapping層,對此,已有有好的解決辦法如Hibernate和JDO。
Spring的目標是使已存在的技術更加易用。例如,儘管我們沒有底層事務協調處理,但我們提供了一個抽象層覆蓋了JTA或任何其他的事務策略。
Spring沒有直接和其他的開源項目競爭,除非我們感到我們能提供新的一些東西。例如,象許多開發人員,我們從來沒有為Struts高興過,並且感到在MVC web framework中還有改進的餘地。在某些領域,例如輕量級的IoC容器和AOP框架,Spring有直接的競爭,但是在這些領域還沒有已經較為流行的解決方案。(Spring在這些區域是開路先鋒。)
Spring也得益於內在的一致性。
所有的開發者都在唱同樣的的讚歌,基礎想法依然是Expert One-on-One J2EE設計與開發的那些。
並且我們已經能夠使用一些主要的概念,例如倒置控制,來處理多個領域。
Spring在套用伺服器之間是可移植的。
當然保證可移植性總是一次挑戰,但是我們避免任何特定平台或非標準化,並且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的套用伺服器上的用戶。