SPRING框架——由來和發展
Spring是java平台上的一個開源應用框架它的第一個版本是由Rod Johnson寫出來的Rod在他的Expert OneOnOne Java EE Design and Development(Java企業應用設計與開發的專家一對一)一書中首次發布了這個框架該框架也可以移植到NET的環境下
Spring的框架首次在年月的Apache 的使用許可中發布第一個具有裡程碑意義的版本是年月發布的年月和年月先後又有重要的版本面世
Spring框架本身並沒有強制實行任何特別的編程模式在Java社區裡Spring作為EJB模型之外的另外一個選擇甚至是替代品而廣為流行從設計上看Spring給予了Java程序員許多的自由度但同時對業界常見的問題也提供了良好的文檔和易於使用的方法
Spring框架的核心功能在任何Java應用中都是適用的在基於Java企業平台上的web應用中大量的拓展和改進得以形成為此Spring獲得了廣泛的歡迎並被許多公司認可為具有戰略意義的重要框架
Spring框架的歷史
Spring框架最開始的部分是由Rod Johnson於年為倫敦的金融界提供獨立咨詢業務時寫出來的在《Java企業應用設計與開發的專家一對一》一書中Rod進一步拓展了他的代碼以闡述如何讓應用程序能以超出當時大眾所慣於接受的易用性和穩定性與JEE平台上的不同組件合作的觀點
在年web應用的主流編程模式為Java Servlet API和EJB兩者都是由太陽微系統公司與其他一些開發商和利益團體提出的並在Java業界裡獲得了廣泛的共識那些非Web的應用比如用戶端的或批處理的應用也可以基於能夠提供所需功能的開源或商用工具和項目
基於最優方法並適用於各種應用類型的Spring框架的建立要歸功於Rod Johnson這些想法也在他的書中得以闡述書發表後基於讀者的要求源代碼在開源使用協議下得以提供
一批自願拓展Spring框架的程序開發員組成了團隊年月在Sourceforge上構建了一個項目在Spring框架上工作了一年之後這個團隊在年月發布了第一個版本()這個版本之後Spring框架在Java社區裡變得異常流行部分的要歸結於它好於一般水准的文檔功能和參考文獻特別是對於一個開源項目而言尤其如此
但是Spring框架在年也備受批評有時它也成為熱烈爭論的主題Spring的第一個版本發布時許多程序員和領先的設計人員把它看作是遠離傳統編程模式的一步;特別是對於EJB而言尤其如此Spring框架的一個重要設計目標就是更容易地與已有的JEE標准和商用工具整合在很大程度上這個目標使得通過受爭議的官方委員會控制的規范文檔來定義功能變得可有可無
Spring框架使之前並不受歡迎的技術在短時間內迅速走紅最有名的例子就是反向控制(IOC)年Spring框架的采用率非常之高;通過推出自身的AOP(面向方向的編程)Spring使AOP整體而言在Java社區裡廣受歡迎
年Spring因具有裡程碑意義的新的版本的推出更多功能的添加從而得到了比年更高的采用率年底創建的Spring論壇也對框架的推廣而推波助瀾論壇對廣大用戶而言已經成為最重要的信息和幫助的源泉
年Spring框架的開發人員成立了自己的公司來提供對Spring的商業支持其中最顯著的就是與BEA的合作年月第一個Spring會議在邁阿密舉行天的課程吸引了名開發人員年月在安特衛普召開的會議有多名開發人員
Spring框架的主要功能
; 基於Java Beans的配置管理采用IOC的原理特別是對依賴注射技術的使用這些都用來減少各組件間對實施細則的相互依賴性
; 一個核心的全局適用的bean工廠
; 一個一般抽象化的層面來管理數據庫間的數據處理
; 建立在框架內的對Java數據處理API和單獨的JDBC數據源的一般性策略因此在數據處理支持上對Java企業版本環境的依賴性得以消除
; 和一些可持續性的框架如HibernateJDOiBATIS和dbo的整合
; web應用中的MVC框架基於核心的Spring功能支持多種產生視圖的技術包括JSPFreeMarkerVelocityTilesiText和POI
; 大量的AOP框架以提供諸如數據處理管理的服務同IOC的功能一樣目的是提高系統的模塊化程度
Spring 框架的七個模塊
Spring 框架是一個分層架構由 個定義良好的模塊組成Spring 模塊構建在核心容器之上核心容器定義了創建配置和管理 bean 的方式如圖 所示
``````````````````````
組成 Spring 框架的每個模塊(或組件)都可以單獨存在或者與其他一個或多個模塊聯合實現每個模塊的功能如下
核心容器核心容器提供 Spring 框架的基本功能核心容器的主要組件是 BeanFactory它是工廠模式的實現BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開
Spring 上下文Spring 上下文是一個配置文件向 Spring 框架提供上下文信息Spring 上下文包括企業服務例如 JNDIEJB電子郵件國際化校驗和調度功能
Spring AOP通過配置管理特性Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中所以可以很容易地使 Spring 框架管理的任何對象支持 AOPSpring AOP 模塊為基於 Spring 的應用程序中的對象提供了事務管理服務通過使用 Spring AOP不用依賴 EJB 組件就可以將聲明性事務管理集成到應用程序中
Spring DAOJDBC DAO 抽象層提供了有意義的異常層次結構可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息異常層次結構簡化了錯誤處理並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構
Spring ORMSpring 框架插入了若干個 ORM 框架從而提供了 ORM 的對象關系工具其中包括 JDOHibernate 和 iBatis SQL Map所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構
Spring Web 模塊Web 上下文模塊建立在應用程序上下文模塊之上為基於 Web 的應用程序提供了上下文所以Spring 框架支持與 Jakarta Struts 的集成Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作
Spring MVC 框架MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現通過策略接口MVC 框架變成為高度可配置的MVC 容納了大量視圖技術其中包括 JSPVelocityTilesiText 和 POI
Spring 框架的功能可以用在任何 JEE 服務器中大多數功能也適用於不受管理的環境Spring 的核心要點是支持不綁定到特定 JEE 服務的可重用業務和數據訪問對象毫無疑問這樣的對象可以在不同 JEE 環境 (Web 或 EJB)獨立應用程序測試環境之間重用
Spring框架的主要功能[NextPage]
組成 Spring 框架的每個模塊(或組件)都可以單獨存在或者與其他一個或多個模塊聯合實現每個模塊的功能如下
核心容器核心容器提供 Spring 框架的基本功能核心容器的主要組件是 BeanFactory它是工廠模式的實現BeanFactory 使用控制反轉 (IOC) 模式將應用程序的配置和依賴性規范與實際的應用程序代碼分開
Spring 上下文Spring 上下文是一個配置文件向 Spring 框架提供上下文信息Spring 上下文包括企業服務例如 JNDIEJB電子郵件國際化校驗和調度功能
Spring AOP通過配置管理特性Spring AOP 模塊直接將面向方面的編程功能集成到了 Spring 框架中所以可以很容易地使 Spring 框架管理的任何對象支持 AOPSpring AOP 模塊為基於 Spring 的應用程序中的對象提供了事務管理服務通過使用 Spring AOP不用依賴 EJB 組件就可以將聲明性事務管理集成到應用程序中
Spring DAOJDBC DAO 抽象層提供了有意義的異常層次結構可用該結構來管理異常處理和不同數據庫供應商拋出的錯誤消息異常層次結構簡化了錯誤處理並且極大地降低了需要編寫的異常代碼數量(例如打開和關閉連接)Spring DAO 的面向 JDBC 的異常遵從通用的 DAO 異常層次結構
Spring ORMSpring 框架插入了若干個 ORM 框架從而提供了 ORM 的對象關系工具其中包括 JDOHibernate 和 iBatis SQL Map所有這些都遵從 Spring 的通用事務和 DAO 異常層次結構
Spring Web 模塊Web 上下文模塊建立在應用程序上下文模塊之上為基於 Web 的應用程序提供了上下文所以Spring 框架支持與 Jakarta Struts 的集成Web 模塊還簡化了處理多部分請求以及將請求參數綁定到域對象的工作
Spring MVC 框架MVC 框架是一個全功能的構建 Web 應用程序的 MVC 實現通過策略接口MVC 框架變成為高度可配置的MVC 容納了大量視圖技術其中包括 JSPVelocityTilesiText 和 POI
Spring 框架的功能可以用在任何 JEE 服務器中大多數功能也適用於不受管理的環境Spring 的核心要點是支持不綁定到特定 JEE 服務的可重用業務和數據訪問對象毫無疑問這樣的對象可以在不同 JEE 環境 (Web 或 EJB)獨立應用程序測試環境之間重用
Spring事務管理
在學習spring事務管理時我忍不住要問spring為什麼進行事務管理spring怎麼進行的事務管理?
首先為什麼要進行事務接下來說說spring是怎樣進行事務管理的
① Spring事務策略
Spring事務策略也就是spring事務管理的實現方式它有一個統一的抽象是由實現下面這個接口完成的
orgspringframeworktransactionPlatformTransactionManager
此接口的內容如下:
Public interfacePlatformTransactionManager(){
TransactionStatue getTransaction(TransactionDefinition definition) throws TransactionException;
Void commit(TransactionStatus status) throws TransactionException;
Void rollback(TransactionStatus status) throws TransactionException;
}
不管是聲明式的還是編程式的事務管理都需要此抽象來完成
解釋一下這個接口這樣可以更好的理解spring的事務控制的原理
getTransaction()根據類型為TransactionDefinition的參數返回一個TransactionStatus對象返回的TransactionStatus對象可能代表一個新的或已經存在的事務(如果在當前調用堆棧有一個符合條件的事務)如同JEE事務上下文一個TransactionStatus也是和執行的線程關聯的
同時在框架中還存在TransactionDefinition接口即上邊的參數類型此接口指定了事務隔離程度事務傳播事務超時只讀狀態
另外還有TransactionStatus接口這個接口為處理事務提供簡單的控制事務執行和查詢事務狀態的方法
② 兩種事務管理方式編程式聲明式
Spring提供兩種方式的編程式事務管理分別是使用TransactionTemplate和直接使用PlatformTransactionManager
ⅰ TransactionTempale采用和其他Spring模板如JdbcTempalte和HibernateTemplate一樣的方法它使用回調方法把應用程序從處理取得和釋放資源中解脫出來如同其他模板TransactionTemplate是線程安全的
代碼片段
Object result =ttexecute(newTransactionCallback(){
publicObject doTransaction(TransactionStatus status){
updateOperation();
returnresultOfUpdateOperation();
}
});
使用TransactionCallback()可以返回一個值
如果使用TransactionCallbackWithoutResult則沒有返回值
ⅱ 也可以使用PlatformTransactionManager直接管理事務簡單地通過一個bean引用給你的bean傳遞一個你使用的PlatformTransaction對象然後使用TransactionDefinition和TransactionStatus對象就可以發起回滾提交事務[NextPage]
如下片段
DefaultTransactionDefinition def=newDefaultTransactionDefinition(); //new 一個事務
defsetPropagationBehavior(TransactionDefinitionPROPAGATION_REQUIRED); //初始化事務參數定義事務的傳播類型;
TransactionStatus status =transactionManagergetTransaction(def); //獲得事務狀態
try{
trmit(status); //提交事務;
}catch(…){
transactionManagerrollback(status); //回滾事務;
}
Spring也提供聲明式事務管理這是通過AOP實現的
大多數Spring用戶選擇聲明式事務管理這是最少影響應用代碼的選擇因而這是和非侵入性的輕量級容器的觀念是一致的
① 通常通過TransactionProxyFactoryBean設置Spring事務代理需要一個目標對象包裝在事務代理中這個目標對象一般是一個普通Javabean當我們定義TransactionProxyFactoryBean時必須提供一個相關的PlatformTransactionManager的引用和事務屬性事務屬性含有事務定義例如:
PROPAGATION_REQUIREDMyCheckedException
PROPAGATION_REQUIRED
PROPAGATION_REQUIREDreadOnly
事務代理會實現目標對象的接口:這裡是屬性名是target的引用id是transactionServiceControl(; 使用CGLIB也可以實現具體類的代理只要設置proxyTargetClass屬性為true即可如果目標對象沒有實現任何接口這將自動設置該屬性為true通常我們希望面向接口編程); 使用proxyInterfaces屬性來限定事務代理來代理指定接口也是可以; 也可以通過從orgspringframeworkaopframeworkProxyConfig繼承或所有AOP代理工廠共享的屬性來定制TransactionProxyFactoryBean行為
然後說說屬性名是transactionAttributes意義
這裡的transactionAttributes屬性是定義在orgspringframeworktransactioninterceptorNameMathTransactionAttributeSource中的屬性格式設置這個包括通配符的方法名稱映射是很直觀的如insert*注意insert*的映射的值包括回滾規則MyCheckException指定如果方法拋出MyCheckException或它的子類事務會自動回滾可以用逗號分隔多個回滾規則前綴強制回滾+前綴指定提交(這允許即使拋出unchecked異常時也可以提交事務)PROPAGATION_REQUIRED指定事務傳播范圍
TransactionProxyFactoryBean允許你通過preInterceptors和postInterceptors屬性設置前或後的攔截操作可以設置任意數量的前和後通過它們的類型可以是Advistor(切入點)MethodInterceptor或被當前Spring配置支持的通知類型例如ThrowAdviceAfterReturningAdvice或BeforeAdvice這些通知必須支持實例共享模式如果你需要高級AOP特性操作事務通過orgspringframeworkaopframeworkProxyFactoryBean而不是TransactionProxyFactory實用代理創建者
② 另一種聲明方式BeanNameAutoProxyCreator
使用TransactionProxyFactoryBean當事務代理包裝對象你可以完全控制代理如果需要用一致方式包裝大量bean使用一個BeanFactoryPostProcessor的一個實現BeanNameAutoProxyCreator可以提供另外一種方法(Spring中一旦ApplicationContext讀完它的初始化信息它將初始化所有實現BeanPostProcessor接口的bean並且讓它們後處理ApplicationContext中所有其他的bean所以使用這種機制正確配置的BeanNameAutoProxyCreator可以用來後處理所有ApplicationContext中所有其他的bean)並且把它們用事務代理包裝起來真正生成的事務代理和使用TransactionProxyFactoryBean生成的基本一致
最後總結一下Spring的優點
Spring是java平台上的一個開源應用框架 Spring框架本身並沒有強制實行任何特別的編程模式在Java社區裡Spring作為EJB模型之外的另外一個選擇甚至是替代品而廣為流行從設計上看Spring給予了Java程序員許多的自由度但同時對業界常見的問題也提供了良好的文檔和易於使用的方法 Spring框架的核心功能在任何Java應用中都是適用的在基於Java企業平台上的web應用中大量的拓展和改進得以形成為此Spring獲得了廣泛的歡迎並被許多公司認可為具有戰略意義的重要框架
From:http://tw.wingwit.com/Article/program/Java/ky/201311/28102.html