Spring是一個開源架構,它由Rod Johnson建立。它是為瞭解決公司專屬應用程式開發的複雜性而建立的。Spring使用基本的JavaBean來完成以前只可能由EJB完成的事情。然而,Spring的用途不僅限
於伺服器端的開發。從簡單性、可測試性和松耦合的角度而言,任何Java應用都可以從Spring中受益。
◆目的:解決公司專屬應用程式開發的複雜性
◆功能:使用基本的JavaBean代替EJB,並提供了更多的公司專屬應用程式功能
◆範圍:任何Java應用 簡單來說,Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器架構。
◆輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring架構可 以在一個大小隻有1MB多的JAR檔案裡發布。並且Spring所需的處理開銷也是微不足道的。此外, Sping是
非侵入式的:典型地,Spring應用中的對象不依賴於Spring的特定類。
◆控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用了IoC,一個對象依賴的其它對象會通過被動的方式傳遞進來,而不是這個對象自己建立或者尋找依賴對象
。你可以認為IoC與JNDI相反——不是對象從容器中尋找依賴,而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
◆面向切面——Spring提供了面向切面編程的豐富支援,允許通過分離應用的商務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發。應用對象只實
現它們應該做的——完成商務邏輯——僅此而已。它們並不負責(甚至是意識)其它的系統級關注點,例如日誌或事務支援。
◆容器——Spring包含並管理應用對象的配置和生命週期,在這個意義上它是一種容器,你可以配置你的每個bean如何被建立——基於一個可配置原型(prototype),你的bean可以建立一個
單獨的執行個體或者每次需要時都產生一個新的執行個體——以及它們是如何相互關聯的。然而,Spring不應該被混同於傳統的重量級的EJB容器,它們經常是龐大與笨重的,難以使用。
◆架構——Spring可以將簡單的組件配置、組合成為複雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML檔案裡。Spring也提供了很多基礎功能(交易管理、持久化架構
整合等等),將應用邏輯的開發留給了你。 所有Spring的這些特徵使你能夠編寫更乾淨、更可管理、並且更易於測試的代碼。它們也為Spring中的各種模組提供了基礎支援。
起源:
你可能正在想“Spring不過是另外一個的framework”。當已經有許多開放原始碼(和專有) J2EE framework時,我們為什麼還需要Spring Framework? Spring是獨特的,因為若干個
原因:
◆它定位的領域是許多其他流行的framework沒有的。Spring關注提供一種方法管理你的業務對象。
◆ Spring是全面的和模組化的。Spring有分層的體繫結構,這意味著你能選擇使用它孤立的任何部分,它的架構仍然是內在穩定的。因此從你的學習中,你可得到最大的價值。例如,你可能選
擇僅僅使用Spring來簡單化JDBC的使用,或用來管理所有的業務對象。
◆它的設計從底部協助你編寫易於測試的代碼。Spring是用於測試驅動工程的理想的framework。Spring對你的工程來說,它不需要一個以上的framework。Spring是潛在地一站式解決方案,
定位於與典型應用相關的大部分基礎結構。它也涉及到其他framework沒有考慮到的內容。
特點:
◆方便解耦,簡化開發 通過Spring提供的IoC容器,我們可以將對象之間的依賴關係交由Spring進行控制,避免寫入程式碼所造成的過度程式耦合。有了Spring,使用者不必再為單一實例模式類
、屬性檔案解析等這些很底層的需求編寫代碼,可以更專註於上層的應用。
◆AOP編程的支援 通過Spring提供的AOP功能,方便進行面向切面的編程,許多不容易用傳統OOP實現的功能可以通過AOP輕鬆應付。
◆聲明式事務的支援 在Spring中,我們可以從單調煩悶的交易管理代碼中解脫出來,通過聲明式方式靈活地進行事務的管理,提高開發效率和品質。
◆方便程式的測試 可以用非容器依賴的編程方式進行幾乎所有的測試工作,在Spring裡,測試不再是昂貴的操作,而是隨手可做的事情。
◆方便整合各種優秀架構 Spring不排斥各種優秀的開源架構,相反,Spring可以降低各種架構的使用難度,Spring提供了對各種優秀架構(如Struts,Hibernate、Hession、Quartz)等
的直接支援。
◆降低Java EE API的使用難度 Spring對很多難用的Java EE API(如JDBC,JavaMail,遠程調用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些Java EE API的使用難度大
為降低。
◆Java 源碼是經典學習範例 Spring的源碼設計精妙、結構清晰、匠心獨用,處處體現著大師對Java設計模式靈活運用以及對Java技術的高深造詣。Spring架構源碼無疑是Java技術的最
佳實踐範例。如果想在短時間內迅速提高自己的Java技術水平和應用開發水平,學習和研究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有如下優點: ◆低侵入式設計,代碼汙染極低 ◆ 獨立於各種應用伺服器,可以真正實現Write Once,Run Anywhere的承諾 ◆Spring的DI機制降低了業務對象
替換的複雜性 ◆Spring並不完全依賴於Spring,開發人員可自由選用Spring架構的部分或全部