<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    【轉自互聯(lián)網(wǎng)】Spring事務管理原理

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

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

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

    1、類代理方式

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

    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就是這樣實現(xiàn)了事務管理。 // 下面的這行代碼也是同樣的效果。

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

    Spring通過CGLib來實現(xiàn)了類代理方式。


    2、接口代理方式

    接口代理方式是通過實現(xiàn)接口,引用類實例來實現(xiàn)的,所以這里一定要有一個接口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類型,雖然兩者都實現(xiàn)了同一個接口,但他們之間并沒有繼承關系。就象ArrayList 和 LinkedList,他們可以轉換成List,但他們之間并不能互相轉換。所以這里必須這樣使用:

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

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

    Spring通過Java動態(tài)代理來實現(xiàn)接口代理。

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

    主站蜘蛛池模板: 四虎精品亚洲一区二区三区| 免费观看激色视频网站(性色) | 乱人伦中文视频在线观看免费| 无码人妻一区二区三区免费| va天堂va亚洲va影视中文字幕| 最近免费中文字幕大全免费| 精品日韩亚洲AV无码一区二区三区| 久久久久久AV无码免费网站下载 | av在线亚洲欧洲日产一区二区| 美女黄频视频大全免费的| 国产免费人人看大香伊| 野花视频在线官网免费1| 亚洲欧洲久久av| 日本免费高清视频| 亚洲精品视频在线免费| 人妻视频一区二区三区免费| 亚洲av无码一区二区三区天堂 | 色偷偷女男人的天堂亚洲网| 69成人免费视频无码专区| 亚洲成a人无码亚洲成av无码| 无码专区一va亚洲v专区在线| GOGOGO免费观看国语| 亚洲一区二区三区高清| 日韩精品福利片午夜免费观着| 在线看亚洲十八禁网站| 亚洲午夜久久久久妓女影院 | 成人免费午夜视频| 一级特黄色毛片免费看| 亚洲AV无码成人精品区天堂 | 免费观看的毛片大全| 怡红院亚洲红怡院在线观看| 亚洲精品无码精品mV在线观看| 1000部夫妻午夜免费| 国产精品国产亚洲区艳妇糸列短篇 | 国产精品爱啪在线线免费观看| 精品国产亚洲AV麻豆 | 亚洲精品国产国语| 国产亚洲精品资在线| 一本岛高清v不卡免费一三区| 污污的视频在线免费观看| 337p欧洲亚洲大胆艺术|