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

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

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

    DANCE WITH JAVA

    開發出高質量的系統

    常用鏈接

    統計

    積分與排名

    好友之家

    最新評論

    Spring的Aop的實現方式

    最近看了一下Spring的Aop和Java的動態代理,下邊利用個小例子,簡單的表述一下。
    Spring中的Aop實現
    一,什么是Aop呢:
    AOP是Aspect Oriented Programming的縮寫,意思是面向方面編程。AOP實際是GoF設計模式的延續,
    設計模式孜孜不倦追求的是調用者和被調用者之間的解耦,AOP可以說也是這種目標的一種實現。
    二,Spring中的Aop
    spring中的aop運用了java中的動態代理來實現的,下邊是我寫的個小例子,便于理解,如有問題請提出。
    1,需求:
     我們經常遇到這樣的情況,在很多不同的操做開始和結尾要做相同的操做。舉個例子,比如你要實現一個對象
    ByBus(乘坐公共汽車旅游)這個對象有一個seat()函數和一個rob()函數.如果你要正常乘車,在上車seat()之前
    須要買票,在下車之前須要查票。如果你要做霸王車rob(),可以不用買票,也不用查票。
    這個時候我們可以有以下兩種實現方法。

     1方法一。
     2    更改seat()方法,在這個方法的第一句加上
     3    System.out.println("buy ticket ");
     4    最后一句加上
     5    System.out.println("check ticket ");
     6    然後調用
     7    ByBus bb = new ByBus();
     8    bb.seat();
     9    bb.rob();
    10方法二。
    11    再調用之前加上    
    12    ByBus bb = new ByBus();
    13    System.out.println("buy ticket ");
    14    bb.seat();
    15    System.out.println("check ticket ");
    16    bb.seat();
    17方法三。
    18    利用代理模式,定義一個接口IByBus . ByBus實現接口 ,定義一個代理類,實現IByBus接口
    19    public class ProxyByBus implements IByBus{
    20        private IByBus byBus;
    21        public ProxyByBus(IByBus byBus){
    22            this.byBus = byBus;
    23        }

    24        public void seat(){
    25            System.out.println("buy ticket ");
    26            byBus.seat();
    27            System.out.println("check ticket ");
    28        }

    29        public void rob(){
    30            byBus.rob();
    31        }

    32    }

    33

    以上三種方法都面臨一個問題,如果函數很多,類也很多,以上幾種方式的實現都不是很美觀。那沒有沒有更好的
    方式呢,這個時候Java的動態代理加入.能較好的解決這個問題,例如我們要加入一種旅游方式ByTrain
    定義IByTrain接口,下邊是利用動態代理的實現:
    定義一個使用動態代理的類

     1package proxy;
     2
     3import java.lang.reflect.InvocationHandler;
     4import java.lang.reflect.Method;
     5import java.lang.reflect.Proxy;
     6
     7public class TxHandler implements InvocationHandler{
     8    private Object originalObject;
     9    public Object bind(Object obj){
    10        this.originalObject = obj;
    11        return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
    12                obj.getClass().getInterfaces(),this);
    13    }

    14    //加入buy ticket ,check ticket
    15    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    16        Object result = null;
    17        if(method.getName().startsWith("seat")){
    18            System.out.println("buy ticket");
    19            result = method.invoke(originalObject, args);
    20            System.out.println("check ticket");
    21        }
    else{
    22            result = method.invoke(originalObject, args);
    23        }

    24        return result;
    25    }

    26}

    27定義一個輔助類
    28package proxy;
    29
    30public class Util {
    31    public static Object getObject(String name){
    32        Object obj= null;
    33        try{
    34            Class clazz = Class.forName(name);
    35            obj = clazz.newInstance();
    36            
    37            TxHandler th = new TxHandler();
    38            obj = th.bind(obj);
    39        }
    catch(Exception e){
    40        }

    41        return obj;
    42    }

    43}

    44
    45然後測試一下結果:
    46package proxy;
    47import java.lang.reflect.Method;
    48public class Test {
    49    public static void main(String[] args) {
    50        try{
    51            String name1 ="proxy.ByBusImpl";
    52            IByBus byBus = (IByBus)Util.getObject(name1);
    53            byBus.seat();
    54            byBus.rob();
    55            //加入一種旅游方式
    56            String name2 ="proxy.ByTrainImpl";
    57            IByTrain byTrain = (IByTrain)Util.getObject(name2);
    58            byTrain.seat();
    59            byTrain.rob();
    60            
    61        }
    catch(Exception e){
    62            e.printStackTrace();
    63        }

    64    }

    65}

    ok我們也實現了同樣的效果,看看代碼量比前幾種的更多,但是試想一下如果我們的旅游方式變的越來越多,
    ByAir By...等等是否這中方式更簡單了呢。

    理解了Java的動態代理,再回到Spring,
    Spring的IOC就類似Util類的作用,根據配制文件(本例中的字符串),在運行時自動生成代理類。
    Spring的Aop就類似TxHandler類的作用,須要的函數例如seat()之前,之后都加入一寫東西,
    Spring加入的是

     1    try{
     2        //之前加入(類似buy ticket)
     3        Transation.begin();
     4        
     5        //調用你的函數.
     6        
     7        //之后加入(類似check ticket)
     8        Transation.commit() 
     9    }
    catch(Exception e){
    10        //加入
    11        Transation.rollback();
    12    }

    13


    這樣你就能在配制文件中來管理事務了。
     
    本文提供實例source下載,見這里:http://www.tkk7.com/Files/dreamstone/proxy.rar
    參考文獻:夏昕的SpringGuide

    posted on 2006-11-14 00:51 dreamstone 閱讀(3782) 評論(5)  編輯  收藏 所屬分類: 設計模式

    評論

    # re: Spring的Aop的實現方式 2006-11-14 12:33 逃兵

    跟夏昕的SpringGuide里面的差不多,
    只不過是詳細點,
    但不夠詳細,比如IByBus及接口那兩個類怎么就貼出來呢?  回復  更多評論   

    # re: Spring的Aop的實現方式 2006-11-15 00:58 dreamstone

    嗯,來源是來自夏昕的SpringGuide,寫這篇文章的目的是為了從另一個角度來看,讓人更容易理解點。 至于說IByBus等其它的類因為并不是重要的東西,所以我沒有貼到文章里邊,為了保持文章簡單性。不過我提供了鏈接可以下載到所有的文中提到的代碼,是可以直接運行的。如果須要文章最后有鏈接。  回復  更多評論   

    # re: Spring的Aop的實現方式 2007-11-19 08:34 sitinspring

    AOP根子就是動態代理機制. 先做個記號,屆時細看.  回復  更多評論   

    # re: Spring的Aop的實現方式[未登錄] 2008-09-25 17:21 test

    很好很好  回復  更多評論   

    # re: Spring的Aop的實現方式 2013-04-02 16:18 rookie

    不好意思我是一個學習階段的
    看了API講解
    handler還是不明不白的

    還有未何會執行到
    invoke()
    bind() 所執行的proxy作用是???



    Spring 的 InvocationHandler
    JDK的 InvocationHandler
    有差別嗎??  回復  更多評論   

    主站蜘蛛池模板: 69影院毛片免费观看视频在线| 日韩特黄特色大片免费视频| 亚洲13又紧又嫩又水多| 一级毛片免费一级直接观看| 亚洲av无码精品网站| 在线观看免费播放av片| 国产.亚洲.欧洲在线| 亚洲精品视频在线观看免费| 婷婷精品国产亚洲AV麻豆不片 | 亚洲女初尝黑人巨高清| 五月婷婷在线免费观看| 日韩在线视频免费| 亚洲狠狠狠一区二区三区| 免费国产a国产片高清| 97精品免费视频| 亚洲短视频在线观看| 亚洲免费二区三区| 97se亚洲国产综合自在线| 国产AV无码专区亚洲AWWW| 毛片免费vip会员在线看| 亚洲av无码专区在线观看下载| 国产成人亚洲综合色影视| 国产无遮挡裸体免费视频| 老司机午夜免费视频| 亚洲无人区视频大全| 德国女人一级毛片免费| 久久久久久国产精品免费无码| 思思久久99热免费精品6 | xvideos永久免费入口| 亚洲中文字幕无码av永久| 国产精品无码一二区免费 | 亚洲国产美女精品久久久久∴| 日韩激情无码免费毛片| 特级毛片在线大全免费播放| 亚洲人成影院午夜网站| 国产精品国产午夜免费福利看 | 亚洲AV无码码潮喷在线观看 | 亚洲伊人久久大香线蕉在观| 日本亚洲欧洲免费天堂午夜看片女人员 | 成人爽A毛片免费看| 日本中文字幕免费高清视频|