DANCE WITH JAVA

          開發(fā)出高質(zhì)量的系統(tǒng)

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          好友之家

          最新評(píng)論

          Spring的Aop的實(shí)現(xiàn)方式

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

           1方法一。
           2    更改seat()方法,在這個(gè)方法的第一句加上
           3    System.out.println("buy ticket ");
           4    最后一句加上
           5    System.out.println("check ticket ");
           6    然後調(diào)用
           7    ByBus bb = new ByBus();
           8    bb.seat();
           9    bb.rob();
          10方法二。
          11    再調(diào)用之前加上    
          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    利用代理模式,定義一個(gè)接口IByBus . ByBus實(shí)現(xiàn)接口 ,定義一個(gè)代理類,實(shí)現(xiàn)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

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

           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定義一個(gè)輔助類
          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然後測(cè)試一下結(jié)果:
          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我們也實(shí)現(xiàn)了同樣的效果,看看代碼量比前幾種的更多,但是試想一下如果我們的旅游方式變的越來越多,
          ByAir By...等等是否這中方式更簡單了呢。

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

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

          13


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

          posted on 2006-11-14 00:51 dreamstone 閱讀(3794) 評(píng)論(5)  編輯  收藏 所屬分類: 設(shè)計(jì)模式

          評(píng)論

          # re: Spring的Aop的實(shí)現(xiàn)方式 2006-11-14 12:33 逃兵

          跟夏昕的SpringGuide里面的差不多,
          只不過是詳細(xì)點(diǎn),
          但不夠詳細(xì),比如IByBus及接口那兩個(gè)類怎么就貼出來呢?  回復(fù)  更多評(píng)論   

          # re: Spring的Aop的實(shí)現(xiàn)方式 2006-11-15 00:58 dreamstone

          嗯,來源是來自夏昕的SpringGuide,寫這篇文章的目的是為了從另一個(gè)角度來看,讓人更容易理解點(diǎn)。 至于說IByBus等其它的類因?yàn)椴⒉皇侵匾臇|西,所以我沒有貼到文章里邊,為了保持文章簡單性。不過我提供了鏈接可以下載到所有的文中提到的代碼,是可以直接運(yùn)行的。如果須要文章最后有鏈接。  回復(fù)  更多評(píng)論   

          # re: Spring的Aop的實(shí)現(xiàn)方式 2007-11-19 08:34 sitinspring

          AOP根子就是動(dòng)態(tài)代理機(jī)制. 先做個(gè)記號(hào),屆時(shí)細(xì)看.  回復(fù)  更多評(píng)論   

          # re: Spring的Aop的實(shí)現(xiàn)方式[未登錄] 2008-09-25 17:21 test

          很好很好  回復(fù)  更多評(píng)論   

          # re: Spring的Aop的實(shí)現(xiàn)方式 2013-04-02 16:18 rookie

          不好意思我是一個(gè)學(xué)習(xí)階段的
          看了API講解
          handler還是不明不白的

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



          Spring 的 InvocationHandler
          JDK的 InvocationHandler
          有差別嗎??  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 平遥县| 鸡东县| 登封市| 兴宁市| 德安县| 繁峙县| 清涧县| 长沙市| 江华| 沙田区| 中方县| 宁乡县| 孟州市| 关岭| 洪洞县| 怀安县| 临潭县| 明星| 大荔县| 澄迈县| 宜州市| 新余市| 报价| 上蔡县| 潍坊市| 汾西县| 建始县| 九江市| 黑水县| 鄂尔多斯市| 哈巴河县| 长武县| 广平县| 潢川县| 宁陕县| 西宁市| 乳源| 张掖市| 镇沅| 锡林浩特市| 吉安县|