【摘 要】Spring是一個非?;钴S的開源框架;它是一個機遇IOC和AOP來構(gòu)架多層J2EE系統(tǒng)的框架,Spring不強迫你必須在每一層中必須使用Spring,因為它在模塊化方面做的很好,它允許你根據(jù)自己的需要選擇使用它的某一模塊;他實現(xiàn)了很優(yōu)雅的MVC,對不同的數(shù)據(jù)訪問技術(shù)提供了統(tǒng)一的接口,采用ICO可以很方便的實現(xiàn)對BEAN類的裝配,提供了簡潔的AOP并據(jù)此實現(xiàn)Transcation Managment等等。
【關(guān)鍵詞】Spring;事務(wù)處理
中圖分類號:TP391 文獻標(biāo)識碼:A 文章編號:1009-8283(2009)03-0217-01
1 Spring 框架
Spring 框架是一個分層架構(gòu),由 7 個定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式。組成 Spring 框架的每個模塊(或組件)都可以單獨存在,或者與其他一個或多個模塊聯(lián)合實現(xiàn)。
2 Spring特性
IoCoC就是Inversion of Control。意味著將你設(shè)計好的類交給系統(tǒng)去控制,而不是在你的類內(nèi)部控制。這稱為控制反轉(zhuǎn)。是面向?qū)ο箢I(lǐng)域新興的編程思想;同時這也是Spring的精髓所在。
Spring IoC,借助于依賴注入設(shè)計模式,使得開發(fā)者不用理會對象自身的生命周期極其關(guān)系,而且能夠改善開發(fā)者對模式的使用。對于一個對象的管理不是什么困難,難就難在對整個對象群的管理。依賴注入可以讓容器管理對象,即“Don’t call me,I will call you”。這樣對象本身的生命周期以及對象之間的關(guān)系就不再讓開發(fā)者費神了。
Spring AOP,借助于Spring實現(xiàn)攔截器,開發(fā)者能夠?qū)崿F(xiàn)以聲名方式使用企業(yè)級服務(wù),比如安全性服務(wù)、事務(wù)服務(wù)。AOP 合理的補充了OOP,借助于Spring AOP,開發(fā)者能夠高效的使用J2EE服務(wù)。
Spring服務(wù)抽象,借助于各種J2EE API抽象,使得開發(fā)者能夠一致地使用J2EE 技術(shù),而不管具體是使用什么J2EE API,借助于Spring服務(wù)抽象,使代碼大大減少,滿足“更少代碼,更少BUG”的軟件設(shè)計原則。
Spring IoC+Spring AOP+Spring服務(wù)抽象,一起形成Spring,這樣一個有機體,使構(gòu)建輕量級J2EE成為可能。
3 事務(wù)處理
Spring提供的兩種事務(wù)管理策略可以讓我們很方便的實現(xiàn)事務(wù)的管理,相對于編程序的事務(wù)管理,聲明式的事務(wù)更具優(yōu)勢,Spring使用AOP的機制自動攔截相關(guān)的方法調(diào)用,將大量的事務(wù)管理邏輯從應(yīng)用代碼中分離出來,開發(fā)者無需手動干預(yù)事務(wù)的開始,提交,關(guān)閉操作,一個完整的事務(wù)管理邏輯一經(jīng)定義,幾乎一勞永逸,其效果就如同事務(wù)管理不存在一樣。
3.1 傳統(tǒng)使用JDBC的事務(wù)管理
以往使用JDBC進行數(shù)據(jù)操作,使用DataSource,從數(shù)據(jù)源中得到Connection,我們知道數(shù)據(jù)源是線程安全的,而連接不是線程安全的,所以對每個請求都是從數(shù)據(jù)源中重新取出一個連接。一般的數(shù)據(jù)源由容器進行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業(yè)容器都提供了這個功能。
按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發(fā)一些異常無法catch,雖然有時候我們會寫DBTool類,來關(guān)閉這些資源,并且保證在關(guān)閉這些資源時,不向外拋異常,但是這樣做會導(dǎo)致額外的麻煩。
3.2 編程序事務(wù)管理
編寫程序的事務(wù)管理可以清楚的定義事務(wù)的邊界,可以實現(xiàn)細粒度的事務(wù)控制,比如你可以通過程序代碼來控制你的事務(wù)何時開始,何時結(jié)束等,與后面介紹的聲明式事務(wù)管理相比,它可以實現(xiàn)細粒度的事務(wù)控制。
Spring提供了幾個關(guān)于事務(wù)處理的類:TransactionDefinition //事務(wù)屬性定義
TranscationStatus //代表了當(dāng)前的事務(wù),可以提交,回滾。
PlatformTransactionManager這個是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個實現(xiàn)的抽象類AbstractPlatformTransactionManager,我們使用的事務(wù)管理類例如DataSourceTransactionManager等都是這個類的子類。
我們使用編程式的事務(wù)管理流程可能如下:
(1) 聲明數(shù)據(jù)源。
(2) 聲明一個事務(wù)管理類,例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等
(3) 在我們的代碼中加入事務(wù)處理代碼:
TransactionDefinition td = new TransactionDefinition();
TransactionStatus ts = transactionManager.getTransaction(td);
try{
//do sth
transactionManager.commit(ts);
}catch(Exception e){transactionManager.rollback(ts);}
使用Spring提供的事務(wù)模板TransactionTemplate:
void add()
{
transactionTemplate.execute( new TransactionCallback(){
pulic Object doInTransaction(TransactionStatus ts)
{ //do sth}
}
}
TransactionTemplate也是為我們省去了部分事務(wù)提交、回滾代碼;定義事務(wù)模板時,需注入事務(wù)管理對象。
3.3 聲明式事務(wù)管理
如果你并不需要細粒度的事務(wù)控制,你可以使用聲明式事務(wù),在Spring中,你只需要在Spring配置文件中做一些配置,即課將操作納入到事務(wù)管理中,解除了和代碼的耦合,這是對應(yīng)用代碼影響最小的選擇,從這一點再次驗證了Spring關(guān)于的概念。當(dāng)你不需要事務(wù)管理的時候,可以直接從Spring配置文件中移除該設(shè)置。
Spring的聲明式事務(wù)管理是通過Spring的AOP機制來實現(xiàn)的,對你而言,這一層是隱藏的,使用事務(wù)管理并不侵入你的開發(fā)組件,也就是說,在你的應(yīng)用代碼中并不需要出現(xiàn)任何關(guān)于事務(wù)管理方面的代碼。Spring在運行過程中,會讀取節(jié)點中的配置信息,并執(zhí)行事務(wù)的管理操作。Spring聲明式事務(wù)處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務(wù)代理。
4 結(jié)束語
Spring可以簡單的把普通的java class納入事務(wù)管理,聲明性的事務(wù)操作起來也很容易。有了Spring之后,聲明性事務(wù)不再是EJB獨有,我們不必為了獲得聲明性事務(wù)的功能而去忍受EJB帶來的種種不便。Spring還提供了惟一的事務(wù)管理抽象,它能夠在各種底層事務(wù)管理技術(shù)(如JTA或者JDBC)之上提供一個一致的編程模型。