Spring框架的事務(wù)管理應(yīng)用分析

時(shí)間:2022-11-17 10:10:00

導(dǎo)語(yǔ):Spring框架的事務(wù)管理應(yīng)用分析一文來(lái)源于網(wǎng)友上傳,不代表本站觀(guān)點(diǎn),若需要原創(chuàng)文章可咨詢(xún)客服老師,歡迎參考。

Spring框架的事務(wù)管理應(yīng)用分析

摘要介紹了J2EE平臺(tái)上JavaWeb開(kāi)發(fā)的spring框架的原理和特性,對(duì)其事務(wù)管理方面的應(yīng)用進(jìn)行了分析。

關(guān)鍵詞Spring;J2EE;控制反轉(zhuǎn);事務(wù)處理

引言

在軟件開(kāi)發(fā)中出現(xiàn)過(guò)各種各樣的框架,開(kāi)源軟件的興起,使得各種各樣的框架紛紛出現(xiàn),例如,Apache組織下就擁有諸多的框架類(lèi)產(chǎn)品??蚣芫褪且唤M協(xié)同工作的類(lèi),它們?yōu)樘囟?lèi)型的軟件構(gòu)筑了一個(gè)可重用的設(shè)計(jì)。然而,傳統(tǒng)的框架使得應(yīng)用程序組件過(guò)分依賴(lài)于框架中的類(lèi),這種耦合度的提高降低了組件的復(fù)用性。Spring框架的出現(xiàn),使得組件之間更松散的耦合成為了可能。

Spring框架簡(jiǎn)介

Spring框架是一個(gè)2003年2月才出現(xiàn)的開(kāi)源項(xiàng)目,該開(kāi)源項(xiàng)目起源自RodJohnson在2002年末出版的《ExpertOne-on-OneJ2EEDesignandDevelopment》一書(shū)中的基礎(chǔ)性代碼。在該書(shū)中,RodJohnson倡導(dǎo)J2EE實(shí)用主義的設(shè)計(jì)思想,而Spring框架正是這一思想的更全面和具體的實(shí)現(xiàn)。Spring框架由一個(gè)容器,一個(gè)配置和組織組件的框架,和一組內(nèi)置的為事務(wù)、持久化和Web用戶(hù)接口提供的服務(wù)組成。作為一種輕量級(jí)的J2EE框架,Spring提供了一種有效的方式來(lái)建立和組織J2EE應(yīng)用程序。

1、Spring特性

IoC(InversionofControl;控制反轉(zhuǎn));又稱(chēng)DI(DependencyInjection;依賴(lài)注入);是面向?qū)ο箢I(lǐng)域新興的編程思想;也是Spring的精髓所在。簡(jiǎn)單地說(shuō);IoC就是指程序之間的關(guān)系由容器來(lái)控制;而不是傳統(tǒng)實(shí)現(xiàn)中由程序代碼直接操控。這也就是所謂“控制反轉(zhuǎn)”的概念所在:控制權(quán)由應(yīng)用代碼轉(zhuǎn)到外部容器,控制權(quán)的轉(zhuǎn)移,也就是所謂的反轉(zhuǎn)。IoC將控制創(chuàng)建的職責(zé)搬進(jìn)了框架中;并把它從應(yīng)用代碼脫離開(kāi)來(lái)。當(dāng)使用Spring的IoC容器時(shí)只需指出組件需要的對(duì)象,在運(yùn)行時(shí)Spring的IoC容器會(huì)根據(jù)XML配置數(shù)據(jù)提供給它。

SpringIoC,借助于依賴(lài)注入設(shè)計(jì)模式,使得開(kāi)發(fā)者不用理會(huì)對(duì)象自身的生命周期極其關(guān)系,而且能夠改善開(kāi)發(fā)者對(duì)模式的使用。對(duì)于一個(gè)對(duì)象的管理不是什么困難,難就難在對(duì)整個(gè)對(duì)象群的管理。依賴(lài)注入可以讓容器管理對(duì)象,即“Don’tcallme,Iwillcallyou”。這樣對(duì)象本身的生命周期以及對(duì)象之間的關(guān)系就不再讓開(kāi)發(fā)者費(fèi)神了。

SpringAOP,借助于Spring實(shí)現(xiàn)攔截器,開(kāi)發(fā)者能夠?qū)崿F(xiàn)以聲名方式使用企業(yè)級(jí)服務(wù),比如安全性服務(wù)、事務(wù)服務(wù)。AOP合理的補(bǔ)充了OOP,借助于SpringAOP,開(kāi)發(fā)者能夠高效的使用J2EE服務(wù)。

Spring服務(wù)抽象,借助于各種J2EEAPI抽象,使得開(kāi)發(fā)者能夠一致地使用J2EE技術(shù),而不管具體是使用什么J2EEAPI,借助于Spring服務(wù)抽象,使代碼大大減少,滿(mǎn)足“更少代碼,更少BUG”的軟件設(shè)計(jì)原則。

SpringIoC+SpringAOP+Spring服務(wù)抽象,一起形成Spring,這樣一個(gè)有機(jī)體,使構(gòu)建輕量級(jí)J2EE成為可能。

Spring提供的事務(wù)管理

Spring提供的事務(wù)管理可以分為兩類(lèi):編程式的和聲明式的。編程式的,比較靈活,但是代碼量大,存在重復(fù)的代碼比較多;聲明式的比編程式的更靈活方便。

1、傳統(tǒng)使用JDBC的事務(wù)管理

以往使用JDBC進(jìn)行數(shù)據(jù)操作,使用DataSource,從數(shù)據(jù)源中得到Connection,我們知道數(shù)據(jù)源是線(xiàn)程安全的,而連接不是線(xiàn)程安全的,所以對(duì)每個(gè)請(qǐng)求都是從數(shù)據(jù)源中重新取出一個(gè)連接。一般的數(shù)據(jù)源由容器進(jìn)行管理,包括連接池。例如TOMCAT,WEBSPHERE,WEBLOGIC等這些J2EE商業(yè)容器都提供了這個(gè)功能。

以往的我們使用JDBC在寫(xiě)代碼時(shí),事務(wù)管理可能會(huì)是這樣:

Connectionconn=null;

try{

conn=DBConnectionFactory.getConnection;

conn.setAutoCommit(false);

//dosomething

mit();//committranscation

}catch(Exceptione){

conn.rollback();

}

finally{

try{

conn.close();

}catch(SQLExceptionse){//dosth.}

//closeResultSet,PreparedStatement,Connection

//notice:MaybeocurrExceptionwhenuclosers,pstmt,conn

}

按照以往的思路來(lái)寫(xiě)代碼,代碼量比較長(zhǎng),而且容易疏忽,忘掉一些try/catch,引發(fā)一些異常無(wú)法catch,雖然有時(shí)候我們會(huì)寫(xiě)DBTool類(lèi),來(lái)關(guān)閉這些資源,并且保證在關(guān)閉這些資源時(shí),不向外拋異常,但是這樣做會(huì)導(dǎo)致額外的麻煩。

2、Spring提供的編程式的事務(wù)處理

Spring提供了幾個(gè)關(guān)于事務(wù)處理的類(lèi):TransactionDefinition//事務(wù)屬性定義

TranscationStatus//代表了當(dāng)前的事務(wù),可以提交,回滾。

PlatformTransactionManager這個(gè)是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個(gè)實(shí)現(xiàn)的抽象類(lèi)AbstractPlatformTransactionManager,我們使用的事務(wù)管理類(lèi)例如DataSourceTransactionManager等都是這個(gè)類(lèi)的子類(lèi)。

我們使用編程式的事務(wù)管理流程可能如下:

(1)聲明數(shù)據(jù)源。

(2)聲明一個(gè)事務(wù)管理類(lèi),例如:DataSourceTransactionManager,HibernateTransactionManger,JTATransactionManager等

(3)在我們的代碼中加入事務(wù)處理代碼:

TransactionDefinitiontd=newTransactionDefinition();

TransactionStatusts=transactionManager.getTransaction(td);

try{

//dosth

mit(ts);

}catch(Exceptione){transactionManager.rollback(ts);}

使用Spring提供的事務(wù)模板TransactionTemplate:

voidadd()

{

transactionTemplate.execute(newTransactionCallback(){

pulicObjectdoInTransaction(TransactionStatusts)

{//dosth}

}

}

TransactionTemplate也是為我們省去了部分事務(wù)提交、回滾代碼;定義事務(wù)模板時(shí),需注入事務(wù)管理對(duì)象。

3、Spring聲明式事務(wù)處理

Spring聲明式事務(wù)處理也主要使用了IoC,AOP思想,提供了TransactionInterceptor攔截器和常用的類(lèi)TransactionProxyFactoryBean,可以直接對(duì)組件進(jìn)行事務(wù)。

使用TransactionInterceptor的步驟:

(1)定義數(shù)據(jù)源,事務(wù)管理類(lèi)

(2)定義事務(wù)攔截器,例如:

<beanid="transactionInterceptor"

class="org.springframework.transaction.interceptor.TransactionInterceptor">

<propertyname="transactionManager"><refbean="transactionManager"/></property>

<propertyname="transactionAttributeSource">

<value>

com.test.UserManager.*r=PROPAGATION_REQUIRED

</value>

</property>

</bean>

(3)為組件聲明一個(gè)類(lèi):ProxyFactoryBean

<beanid="userManager"class="org.springframework.aop.framework.ProxyFactoryBean">

<propertyname="proxyInterfaces"><value>com.test.UserManager</value></property>

<propertyname="interceptorNames">

<list>

<idreflocal="transactionInterceptor"/>

</list>

</property>

</bean>

使用TransactionProxyFactoryBean:

<beanid="userManager"

class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean">

<propertyname="transactionManager"><refbean="transactionManager"/></property>

<propertyname="target"><reflocal="userManagerTarget"/></property>

<propertyname="transactionAttributes">

<props>

<propkey="insert*">PROPAGATION_REQUIRED</prop>

<propkey="update*">PROPAGATION_REQUIRED</prop>

<propkey="*">PROPAGATION_REQUIRED,readOnly</prop>

</props>

</property>

</bean>

TransactionProxyFactoryBean只是為組件的事務(wù),如果我們要給組件添加一些業(yè)務(wù)方面的驗(yàn)證等,可以使用TransactionTemplate加攔截器方式,為組件添加多個(gè)攔截器,springAOP中提供了三類(lèi)Advice,即前增強(qiáng),后增強(qiáng),拋出異常時(shí)的增強(qiáng),可以靈活使用。

結(jié)束語(yǔ)

Spring可以簡(jiǎn)單的把普通的javaclass納入事務(wù)管理,聲明性的事務(wù)操作起來(lái)也很容易。有了Spring之后,聲明性事務(wù)不再是EJB獨(dú)有,我們不必為了獲得聲明性事務(wù)的功能而去忍受EJB帶來(lái)的種種不便。Spring還提供了惟一的事務(wù)管理抽象,它能夠在各種底層事務(wù)管理技術(shù)(如JTA或者JDBC)之上提供一個(gè)一致的編程模型。