- 相關(guān)推薦
Spring框架的事務(wù)管理應(yīng)用分析
摘 要 介紹了J2EE平臺上Java Web開發(fā)的Spring框架的原理和特性,對其事務(wù)管理方面的應(yīng)用進行了分析。關(guān)鍵詞 Spring; J2EE; 控制反轉(zhuǎn); 事務(wù)處理
引 言
在軟件開發(fā)中出現(xiàn)過各種各樣的框架,開源軟件的興起,使得各種各樣的框架紛紛出現(xiàn),例如,Apache組織下就擁有諸多的框架類產(chǎn)品?蚣芫褪且唤M協(xié)同工作的類,它們?yōu)樘囟愋偷能浖䴓?gòu)筑了一個可重用的設(shè)計。然而,傳統(tǒng)的框架使得應(yīng)用程序組件過分依賴于框架中的類,這種耦合度的提高降低了組件的復(fù)用性。Spring框架的出現(xiàn),使得組件之間更松散的耦合成為了可能。
Spring框架簡介
Spring框架是一個2003年2月才出現(xiàn)的開源項目,該開源項目起源自Rod Johnson在2002年末出版的《Expert One-on-One J2EE Design and Development》一書中的基礎(chǔ)性代碼。在該書中,Rod Johnson倡導(dǎo)J2EE實用主義的設(shè)計思想,而Spring框架正是這一思想的更全面和具體的實現(xiàn)。Spring框架由一個容器,一個配置和組織組件的框架,和一組內(nèi)置的為事務(wù)、持久化和Web用戶接口提供的服務(wù)組成。作為一種輕量級的J2EE框架,Spring提供了一種有效的方式來建立和組織J2EE應(yīng)用程序。
1、Spring特性
IoC(Inversion of Control;控制反轉(zhuǎn));又稱DI(Dependency Injection;依賴注入);是面向?qū)ο箢I(lǐng)域新興的編程思想;也是Spring的精髓所在。簡單地說;IoC就是指程序之間的關(guān)系由容器來控制;而不是傳統(tǒng)實現(xiàn)中由程序代碼直接操控。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼轉(zhuǎn)到外部容器,控制權(quán)的轉(zhuǎn)移,也就是所謂的反轉(zhuǎn)。IoC將控制創(chuàng)建的職責(zé)搬進了框架中;并把它從應(yīng)用代碼脫離開來。當(dāng)使用Spring的IoC容器時只需指出組件需要的對象,在運行時Spring的IoC容器會根據(jù)XML配置數(shù)據(jù)提供給它。
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成為可能。
Spring提供的事務(wù)管理
Spring提供的事務(wù)管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復(fù)的代碼比較多;聲明式的比編程式的更靈活方便。
1、傳統(tǒng)使用JDBC的事務(wù)管理
以往使用JDBC進行數(shù)據(jù)操作,使用DataSource,從數(shù)據(jù)源中得到Connection,我們知道數(shù)據(jù)源是線程安全的,而連接不是線程安全的,所以對每個請求都是從數(shù)據(jù)源中重新取出一個連接。一般的數(shù)據(jù)源由容器進行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業(yè)容器都提供了這個功能。
以往的我們使用JDBC在寫代碼時,事務(wù)管理可能會是這樣:
Connection conn = null; try{ conn = DBConnectionFactory.getConnection; conn.setAutoCommit(false); //do something conn.commit(); //commit transcation }catch(Exception e){ conn.rollback(); } finally{ try{ conn.close(); } catch(SQLException se){ //do sth.} //close ResultSet,PreparedStatement,Connection //notice:Maybe ocurr Exception when u close rs,pstmt,conn } |
按照以往的思路來寫代碼,代碼量比較長,而且容易疏忽,忘掉一些try/catch,引發(fā)一些異常無法catch,雖然有時候我們會寫DBTool類,來關(guān)閉這些資源,并且保證在關(guān)閉這些資源時,不向外拋異常,但是這樣做會導(dǎo)致額外的麻煩。
2、Spring提供的編程式的事務(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、Spring聲明式事務(wù)處理
Spring聲明式事務(wù)處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的代理類TransactionProxyFactoryBean,可以直接對組件進行事務(wù)代理。
使用TransactionInterceptor的步驟:
。1)定義數(shù)據(jù)源,事務(wù)管理類
。2)定義事務(wù)攔截器,例如:
<bean id = "transactionInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="transactionAttributeSource">
<value>
com.test.UserManager.*r=PROPAGATION_REQUIRED
</value>
</property>
</bean>
(3)為組件聲明一個代理類:ProxyFactoryBean
<bean id="userManager" class="org.springframework.aop.framework.ProxyFactoryBean">
<property name="proxyInterfaces"><value>com.test.UserManager</value></property>
<property name="interceptorNames">
<list>
<idref local="transactionInterceptor"/>
</list>
</property>
</bean>
使用TransactionProxyFactoryBean:
<bean id="userManager"
class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">
<property name="transactionManager"><ref bean="transactionManager"/></property>
<property name="target"><ref local="userManagerTarget"/></property>
<property name="transactionAttributes">
<props>
<prop key="insert*">PROPAGATION_REQUIRED</prop>
<prop key="update*">PROPAGATION_REQUIRED</prop>
<prop key="*">PROPAGATION_REQUIRED,readOnly</prop>
</props>
</property>
</bean>
TransactionProxyFactoryBean只是為組件的事務(wù)代理,如果我們要給組件添加一些業(yè)務(wù)方面的驗證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個攔截器,spring AOP中提供了三類Advice,即前增強,后增強,拋出異常時的增強,可以靈活使用。
結(jié)束語
Spring可以簡單的把普通的java class納入事務(wù)管理,聲明性的事務(wù)操作起來也很容易。有了Spring之后,聲明性事務(wù)不再是EJB獨有,我們不必為了獲得聲明性事務(wù)的功能而去忍受EJB帶來的種種不便。Spring還提供了惟一的事務(wù)管理抽象,它能夠在各種底層事務(wù)管理技術(shù)(如JTA或者JDBC)之上提供一個一致的編程模型。