【轉自互聯網】Spring事務管理原理

          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動態代理來實現接口代理。

          posted on 2008-08-27 20:15 金家寶 閱讀(391) 評論(0)  編輯  收藏 所屬分類: Spring2.5框架

          主站蜘蛛池模板: 读书| 冷水江市| 繁峙县| 普定县| 湘阴县| 嘉善县| 汝南县| 会理县| 丹阳市| 永城市| 雷波县| 屏边| 皮山县| 滦南县| 洛川县| 油尖旺区| 英吉沙县| 岗巴县| 福建省| 抚远县| 青海省| 东明县| 香河县| 于田县| 涟水县| 沿河| 威海市| 都匀市| 克什克腾旗| 武冈市| 博湖县| 浙江省| 鹤山市| 仁怀市| 德令哈市| 新绛县| 锡林浩特市| 西充县| 保山市| 元谋县| 噶尔县|