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

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

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

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

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

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

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

    1、類代理方式

    類代理方式的實(shí)現(xiàn)方式是通過繼承的方式來實(shí)現(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{
             啟動事務(wù)的代碼;
              super.save(object);
             提交事務(wù)的代碼; 
          }catch(Exception e){
             回滾事務(wù)的代碼;
          }
      }
    
    		

    }

    在Action的調(diào)用代碼:

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

    這里 getBean("aProxyServiceBeanName") 得到的是 AProxyService 類的實(shí)例,因?yàn)锳ProxyService是AService的一個(gè)子類,所以這里可以強(qiáng)制轉(zhuǎn)型為AService。我們后面調(diào)用a.save(object)的時(shí)候,調(diào)用的是AProxyService.save()方法,而這個(gè)方法是有事務(wù)處理的。Spring就是這樣實(shí)現(xiàn)了事務(wù)管理。 // 下面的這行代碼也是同樣的效果。

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

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


    2、接口代理方式

    接口代理方式是通過實(shí)現(xiàn)接口,引用類實(shí)例來實(shí)現(xiàn)的,所以這里一定要有一個(gè)接口IAService,而類代理方式是不需要這個(gè)接口的。

    // Spring自動生成的代理類.

    class AProxyService implements IAService{

    				  private AService aService;
    
    		
    				  public void setAService(AService aService){
         this.aService = aService;
      }
    
    		
    				  public void save(ValueObject object){
          try{
             啟動事務(wù)的代碼;
             aService.save(object); // 注意這行代碼與上面的不同。
             提交事務(wù)的代碼; 
          }catch(Exception e){
             回滾事務(wù)的代碼;
          }
      }
    
    		

    }

    在Action的調(diào)用代碼:

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

    上面這行代碼會報(bào)ClassCastException錯(cuò)誤,因?yàn)?getBean("aProxyServiceBeanName") 得到的是 AProxyService 類的實(shí)例,而AProxyService實(shí)例并不能轉(zhuǎn)型為AService類型,雖然兩者都實(shí)現(xiàn)了同一個(gè)接口,但他們之間并沒有繼承關(guān)系。就象ArrayList 和 LinkedList,他們可以轉(zhuǎn)換成List,但他們之間并不能互相轉(zhuǎn)換。所以這里必須這樣使用:

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

    調(diào)用a.save() 方法其實(shí)就是調(diào)用 AProxyService.save() 方法。

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

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

    主站蜘蛛池模板: 久久不见久久见免费视频7| 二个人看的www免费视频| 99久热只有精品视频免费观看17| 国产精品亚洲w码日韩中文| 香蕉97碰碰视频免费| 亚洲成人国产精品| 亚洲精品黄色视频在线观看免费资源| 国产青草视频在线观看免费影院| 亚洲成在人线aⅴ免费毛片| 日本免费电影一区| 免费无码婬片aaa直播表情| 亚洲成人一区二区| 四虎影视无码永久免费| 久久亚洲AV午夜福利精品一区| 久久免费观看国产精品| 亚洲人成网站在线观看播放动漫 | 91视频精品全国免费观看| 亚洲V无码一区二区三区四区观看| 久久成人免费播放网站| 亚洲伊人色一综合网| 国产又大又长又粗又硬的免费视频 | 99蜜桃在线观看免费视频网站| 亚洲国产美女精品久久久久| 最新中文字幕免费视频| 污网站免费在线观看| 亚洲狠狠综合久久| 午夜免费不卡毛片完整版| 国产精品无码亚洲精品2021 | 亚洲综合色丁香麻豆| 好吊妞在线成人免费| 最近的2019免费中文字幕| 亚洲精品中文字幕乱码影院| 国产免费直播在线观看视频| 免费无码又爽又刺激网站| 亚洲宅男精品一区在线观看| 亚洲人午夜射精精品日韩| 国产免费一区二区三区| 一边摸一边桶一边脱免费视频| 亚洲一区中文字幕久久| 亚洲一级黄色视频| 日韩av无码成人无码免费|