程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> spring提供的事務管理

spring提供的事務管理

編輯:關於JAVA

spring提供的事務管理可以分為兩類:編程式的和聲明式的。編程式的,比較靈活,但是代碼量大, 存在重復的代碼比較多;聲明式的比編程式的更靈活。編程式主要使用transactionTemplate。省略了部 分的提交,回滾,一系列的事務對象定義,需注入事務管理對象;聲明式:主要使用 TransactionProxyFactoryBean,圍繞Poxy的動態代理,能夠自動的提交和回滾事務。統觀spring事務, 圍繞著兩個核心PlatformTransactionManager和TransactionStatus,下面我們以聲明式方式來講解。

Spring聲明式是以代理的方式實現對事務的管理。我們在Action中所使用的Service對象,其實是代理 對象的實例,並不是我們所寫的Service對象實例。既然是兩個不同的對象,那為什麼我們在Action中可 以象使用Service對象一樣的使用代理對象呢?為了說明問題,假設有個Service類叫AService,它的 Spring事務代理類為AProxyService,AService實現了一個接口 IAService (這裡多了一個接口 IAService,是為了說明接口代理的方式)。

Spring事務代理方式有兩種,一種是類代理方式,一種 是接口代理方式。在Spring的配置文件中可以指定代理方式,目前我們使用的都是類代理方式。 //以下 配置指定為類代理方式

<property name="proxyTargetClass"><value>true</value></property>

1、 類代理方式

類代理方式的實現方式是通過繼承的方式來實現,下面用偽代碼來說明。

interface IAService{
  public void save(ValueObject object);
    
}
    
class AService implements IAService{
  public void save(ValueObject object){ ... }
    
}
    
// Spring自動生成的代理類.
    
class AProxyService extends AService{
  public void save(ValueObject object){
      try{
         啟動事務的代碼;
          super.save(object);
         提交事務的代碼;
      }catch(Exception e){
         回滾事務的代碼;
      }
  }
    
}

在Action的調用代碼:

AService a = (AService)getBean("aProxyServiceBeanName");

這裡 getBean("aProxyServiceBeanName") 得到的是 AProxyService 類的實例,因為 AProxyService是AService的一個子類,所以這裡可以強制轉型為AService。我們後面調用a.save (object)的時候,調用的是AProxyService.save()方法,而這個方法是有事務處理的。Spring就是這樣實 現了事務管理。 // 下面的這行代碼也是同樣的效果。

IAService a = (IAService)getBean ("aProxyServiceBeanName");

Spring通過CGLib來實現了類代理方式。


2、接口代理方式

接口代理方式是通過實現接口,引用類實例來實現的,所以這裡一定要有一個接口 IAService,而類代理方式是不需要這個接口的。

// Spring自動生成的代理類.
    
class AProxyService implements IAService{
  private AService aService;
   public void setAService(AService aService){
     this.aService = aService;
  }
   public void save(ValueObject object){
      try{
         啟動事務的代碼;
         aService.save(object); // 注意這行代碼與上面的不同。
         提交事務的代碼;
      }catch(Exception e){
         回滾事務的代碼;
      }
  }
    
}

在Action的調用代碼:

AService a = (AService)getBean("aProxyServiceBeanName");

上面這行代碼會報ClassCastException錯誤,因為 getBean("aProxyServiceBeanName") 得到的是 AProxyService 類的實例,而AProxyService實例並不能轉型為AService類型,雖然兩者都實現 了同一個接口,但他們之間並沒有繼承關系。就象ArrayList 和 LinkedList,他們可以轉換成List,但 他們之間並不能互相轉換。所以這裡必須這樣使用:

IAService a = (IAService)getBean ("aProxyServiceBeanName"); // 要轉換成接口類型。

調用a.save() 方法其實就是調用 AProxyService.save() 方法。

Spring通過Java動態代理來實現接口代理

查看本欄目

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved