SPRING

出自 华夏文化百科
前往: 導覽、 搜尋

基本簡介

Spring是一個開源框架,它由RodJohnson創建。它是為了解決企業應用開發的複雜性而創建的。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中的各種模塊提供了基礎支持。


起源背景

RodJohson在2002年編著的《ExpertonetooneJ2EEdesignanddevelopment》一書中,對JavaEE正統框架臃腫、低效、脫離現實的種種現狀提出了質疑,並積極尋求探索革新之道。以此書為指導思想,他編寫了interface21框架,這是一個力圖衝破JavaEE傳統開發的困境,從實際需求出發,著眼於輕便、靈巧,易於開發、測試和部署的輕量級開發框架。

Spring框架即以interface21框架為基礎,經過重新設計,並不斷豐富其內涵,於2004年3月24日,發布了1.0正式版。他又推出了一部堪稱經典的力作《Expertone-to-oneJ2EEDevelopmentvithoutEJB》,該書在Java世界掀起了軒然大波,不斷改變著Java開發者程序設計和開發的思考方式。在該書中,作者根據自己多年豐富的實踐經驗,對EJB的各種笨重臃腫的結構進行了逐一的分析和否定,並分別以簡潔實用的方式替換之。至此一戰功成,RodJohnson成為一個改變Java世界的大師級人物。


傳統J2EE應用的開發效率低,應用伺服器廠商對各種技術的支持並沒有真正統一,導致J2EE的應用沒有真正實現WriteOnce及RunAnywhere的承諾。Spring作為開源的中間件,獨立於各種應用伺服器,甚至無須應用伺服器的支持,也能提供應用伺服器的功能,如聲明式事務等。


Spring致力於J2EE應用的各層的解決方案,而不是僅僅專注於某一層的方案。可以說Spring是企業應用開發的「一站式」選擇,並貫穿表現層、業務層及持久層。然而,Spring並不想取代那些已有的框架,而與它們無縫地整合。


需求原因

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)等的直接支持。


降低JavaEEAPI的使用難度


Spring對很多難用的JavaEEAPI(如JDBC,JavaMail,遠程調用等)提供了一個薄薄的封裝層,通過Spring的簡易封裝,這些JavaEEAPI的使用難度大為降低。


Java源碼是經典學習範例


Spring的源碼設計精妙、結構清晰、匠心獨用,處處體現著大師對Java設計模式靈活運用以及對Java技術的高深造詣。Spring框架源碼無疑是Java技術的最佳實踐範例。如果想在短時間內迅速提高自己的Java技術水平和應用開發水平,學習和研究Spring源碼將會使你收到意想不到的效果。


基本框架

Spring 框架是一個分層架構,由 7 個定義良好的模塊組成。Spring 模塊構建在核心容器之上,核心容器定義了創建、配置和管理 bean 的方式,如圖所示:

組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯合實現。每個模塊的功能如下:


1、核心容器:核心容器提供 Spring 框架的基本功能。核心容器的主要組件是 BeanFactory,它是工廠模式的實現。BeanFactory 使用控制反轉 (IOC) 模式將應用程式的配置和依賴性規範與實際的應用程式代碼分開。


2、Spring 上下文:Spring 上下文是一個配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企業服務,例如 JNDI、EJB、電子郵件、國際化、校驗和調度功能。


3、Spring AOP:通過配置管理特性,Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中。所以,可以很容易地使 Spring 框架管理的任何對象支持 AOP。Spring AOP 模塊為基於 Spring 的應用程式中的對象提供了事務管理服務。通過使用 Spring AOP,不用依賴 EJB 組件,就可以將聲明性事務管理集成到應用程式中。


4、Spring DAO:JDBC DAO 抽象層提供了有意義的異常層次結構,可用該結構來管理異常處理和不同資料庫供應商拋出的錯誤消息。異常層次結構簡化了錯誤處理,並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)。Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構。


5、Spring ORM:Spring 框架插入了若干個 ORM 框架,從而提供了 ORM 的對象關係工具,其中包括 JDO、Hibernate 和 iBatis SQL Map。所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構。


6、Spring Web 模塊:Web 上下文模塊建立在應用程式上下文模塊之上,為基於 Web 的應用程式提供了上下文。所以,Spring 框架支持與 Jakarta Struts 的集成。Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作。


7、Spring MVC 框架:MVC 框架是一個全功能的構建 Web 應用程式的 MVC 實現。通過策略接口,MVC 框架變成為高度可配置的,MVC 容納了大量視圖技術,其中包括 JSP、Velocity、Tiles、iText 和 POI。Spring 框架的功能可以用在任何 J2EE 伺服器中,大多數功能也適用於不受管理的環境。Spring 的核心要點是:支持不綁定到特定 J2EE 服務的可重用業務和數據訪問對象。毫無疑問,這樣的對象可以在不同J2EE 環境(Web 或EJB)、獨立應用程式、測試環境之間重用。


框架優點

Spring能有效地組織你的中間層對象,無論你是否選擇使用了EJB。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的framework,你會發現Spring關注了遺留下的問題。Spring能消除在許多工程上對Singleton的過多使用。根據我的經驗,這是一個主要的問題,它減少了系統的可測試性和面向對象特性。

Spring能消除使用各種各樣格式的屬性定製文件的需要,在整個應用和工程中,可通過一種一致的方法來進行配置。曾經感到迷惑,一個特定類要查找迷幻般的屬性關鍵字或系統屬性,為此不得不讀Javadoc乃至源編碼,有了Spring,你可很簡單地看到類的JavaBean屬性。倒置控制的使用(在下面討論)幫助完成這種簡化。


Spring能通過接口而不是類促進好的編程習慣,減少編程代價到幾乎為零。


Spring被設計為讓使用它創建的應用儘可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。


使用Spring構建的應用程式易於單元測試。Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必然選擇。你能選擇用POJOs或localEJBs來實現業務接口,卻不會影響調用代碼。Spring幫助你解決許多問題而無需使用EJB。Spring能提供一種EJB的替換物,它們適於許多web應用。例如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,如果你僅僅需要與單個的資料庫打交道,甚至不需要JTA實現。Spring為數據存取提供了一致的框架,不論是使用JDBC或O/Rmapping產品(如Hibernate)。Spring確實使你能通過最簡單可行的解決辦法解決你的問題。這些特性是有很大價值的。


總結起來,Spring有如下優點:低侵入式設計,代碼污染極低獨立於各種應用伺服器,可以真正實現WriteOnce,RunAnywhere的承諾Spring的DI機制降低了業務對象替換的複雜性Spring並不完全依賴於Spring,開發者可自由選用Spring框架的部分或全部


功能作用

Spring提供許多功能,在此將快速地依次展示其各個主要方面。

首先,明確Spring範圍。儘管Spring覆蓋了許多方面,但已經有清楚的概念,它什麼應該涉及和什麼不應該涉及。Spring的主要目的是使J2EE易用和促進好編程習慣。Spring不重新開發已有的東西。因此,在Spring中你將發現沒有日誌記錄的包,沒有連接池,沒有分布事務調度。這些均有開源項目提供(例如CommonsLogging用來做所有的日誌輸出,或CommonsDBCP用來作數據連接池),或由你的應用程序伺服器提供。因為同樣的的原因,沒有提供O/Rmapping層,對此,已有有好的解決辦法如Hibernate和JDO。


Spring的目標是使已存在的技術更加易用。Spring沒有直接和其他的開源項目競爭,除非感到能提供新的一些東西。例如,象許多開發人員,從來沒有為Struts高興過,並且感到在MVCwebframework中還有改進的餘地。在某些領域,例如輕量級的IoC容器和AOP框架,Spring有直接的競爭,但是在這些領域還沒有已經較為流行的解決方案。(Spring在這些區域是開路先鋒)


Spring也得益於內在的一致性。所有的開發者都在唱同樣的的讚歌,基礎想法依然是ExpertOne-on-OneJ2EE設計與開發的那些。並且能夠使用一些主要的概念,例如倒置控制,來處理多個領域。


Spring在應用伺服器之間是可移植的。當然保證可移植性總是一次挑戰,但是避免任何特定平台或非標準化,並且支持在WebLogic,Tomcat,Resin,JBoss,WebSphere和其他的應用伺服器上的用戶。


下載安裝

下載和安裝Spring請按如下步驟進行。

(1)登錄http://www.springframework.org/download站點,下載Spring的最新穩定版本。最新版本為SpringFramework2.5.5.建議下載spring-framework-2.5.5-with-dependencies.zip這個壓縮包不公包含Spring的開發包,而且包含Spring編譯和運行所依賴的第三方類庫。下載地址:http://mesh.dl.sourceforge.net/sourceforge/springframework/spring-framework-2.5.5-with-dependencies.zip解压缩下载到的压缩包,解压缩后的文件夹应用如下几个文件夹。


dist:該文件夾下放Spring的jar包,通常只需要Spring.jar文件即可。該文件夾下還有一些類似spring-Xxx.jar的壓縮包,這些壓縮包是spring.jar壓縮包的子模塊壓縮包。除非確定整個J2EE應用只需要使用Spring的某一方面時,才考慮使用這中分模塊壓縮包。通常建議使用Spring.jar


docs:該文件夾下包含spring的相關文檔、開發指南及API參考文檔。


lib:該文件夾下包含spring編譯和運行所依賴的第三方類庫,該路徑下的類庫並不是spring必需的,但如果需要使用第三方類庫的支持,這裡的類庫就是必需要的。


samples:該文件夾下包含Spring的幾個簡單例子,可作為Spring入門學習的案例。


src:該文件夾下包含Spring的全部源文件,如果開發過程中有地方無法把握,可以參考該源文件,了解底層實現。


test:該文件夾下包含Spring的測試示例。


tiger:該路徑下存放關於JDK的相關內容解壓縮後的文件夾下,還包含一些關於Spring的License和項目相關文件。


(2)將spring.jar複製到項目的CLASSPATH路徑下,對於Web應用,將spring.jar文件複製到WEB-INF/lib路徑下,該應用即可以利用Spring框架了。


(3)通常Spring的框架還依賴於其他一些jar文件,因此還須將lib下對應的包複製到WEB-INF/lib路徑下,具體要複製哪些jar文件,取決於應用所需要使用的項目。通常需要複製cglib,dom4j,jakarta-commons,log4j等文件夾下的jar文件。


(4)為了編譯java文件,可以找到Spring的基礎類,將Spring.jar文件的路徑添加到環境變量CLASSPATH中。當然,也可以使用ANT工具,但無須添加環境變量。如果使用Eclipse或者NetBeans等IDE時,也不需要設置環境變量。


IOC和AOP

控制反轉模式(也稱作依賴性注入)的基本概念是:不創建對象,但是描述創建它們的方式。在代碼中不直接與對象和服務連接,但在配置文件中描述哪一個組件需要哪一項服務。容器 (在 Spring 框架中是 IOC 容器) 負責將這些聯繫在一起。


在典型的 IOC 場景中,容器創建了所有對象,並設置必要的屬性將它們連接在一起,決定什麼時間調用方法。下表列出了 IOC 的一個實現模式。



類型 1 服務需要實現專門的接口,通過接口,由對象提供這些服務,可以從對象查詢依賴性(例如,需要的附加服務)。
類型 2 通過 JavaBean 的屬性(例如 setter 方法)分配依賴性。
類型 3 依賴性以構造函數的形式提供,不以 JavaBean 屬性的形式公開。

 


Spring 框架的 IOC 容器採用類型 2 和類型3 實現。


 面向方面的編程,即 AOP,是一種編程技術,它允許程式設計師對橫切關注點或橫切典型的職責分界線的行為(例如日誌和事務管理)進行模塊化。AOP 的核心構造是方面,它將那些影響多個類的行為封裝到可重用的模塊中。


AOP 和 IOC 是補充性的技術,它們都運用模塊化方式解決企業應用程式開發中的複雜問題。在典型的面向對象開發方式中,可能要將日誌記錄語句放在所有方法和 Java 類中才能實現日誌功能。在 AOP 方式中,可以反過來將日誌服務模塊化,並以聲明的方式將它們應用到需要日誌的組件上。當然,優勢就是 Java 類不需要知道日誌服務的存在,也不需要考慮相關的代碼。所以,用 Spring AOP 編寫的應用程式代碼是鬆散耦合的。


AOP 的功能完全集成到了 Spring 事務管理、日誌和其他各種特性的上下文中。


IOC容器

Spring 設計的核心是 org.springframework.beans 包,它的設計目標是與 JavaBean 組件一起使用。這個包通常不是由用戶直接使用,而是由伺服器將其用作其他多數功能的底層中介。下一個最高級抽象是 BeanFactory 接口,它是工廠設計模式的實現,允許通過名稱創建和檢索對象。BeanFactory 也可以管理對象之間的關係。

BeanFactory 支持兩個對象模型。


 1、單態 模型提供了具有特定名稱的對象的共享實例,可以在查詢時對其進行檢索。Singleton 是默認的也是最常用的對象模型。對於無狀態服務對象很理想。


2、原型 模型確保每次檢索都會創建單獨的對象。在每個用戶都需要自己的對象時,原型模型最適合。


bean 工廠的概念是 Spring 作為 IOC 容器的基礎。IOC 將處理事情的責任從應用程式代碼轉移到框架。