<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
    有差別嗎??  回復  更多評論   

    主站蜘蛛池模板: 国产乱子伦精品免费女| 亚洲AV日韩AV永久无码绿巨人| 美女视频免费看一区二区| 精品国产综合成人亚洲区| 免费国产黄网站在线观看视频| 亚洲国产精品无码中文lv| 亚洲精品无码午夜福利中文字幕 | 亚洲午夜日韩高清一区| 99国产精品免费观看视频| 亚洲av无码一区二区三区人妖| 亚洲热线99精品视频| 免费看AV毛片一区二区三区| 韩日电影在线播放免费版| 亚洲人成人网站18禁| 亚洲AV无码国产精品麻豆天美| 日韩成全视频观看免费观看高清 | 三年片在线观看免费大全| 一区二区三区免费视频播放器| 91亚洲性爱在线视频| 伊人久久大香线蕉亚洲| 妞干网在线免费观看| 99视频在线免费| 九九久久精品国产免费看小说| 国产成人亚洲精品| 久久亚洲综合色一区二区三区 | 久久免费精品视频| 国产成人亚洲精品91专区高清| 久久久国产精品亚洲一区| 日本免费中文字幕在线看| 99精品国产成人a∨免费看| 特级毛片aaaa免费观看| 亚洲av成人一区二区三区| 亚洲毛片在线观看| 久久亚洲国产精品123区| 操美女视频免费网站| 久久这里只精品国产免费10| 一级毛片试看60分钟免费播放| 亚洲色偷偷色噜噜狠狠99| 亚洲成av人片在线看片| 亚洲色大成网站WWW久久九九| 成人免费无码大片A毛片抽搐色欲|