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

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

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

       :: 首頁 ::  :: 聯(lián)系 :: 聚合  :: 管理

    AOP基礎(chǔ):動態(tài)代理

    Posted on 2009-11-07 21:27 codingliyi 閱讀(258) 評論(0)  編輯  收藏 所屬分類: Design Patterns

    在了解動態(tài)代理之前,有必要先知道什么是靜態(tài)代理。

    1. 靜態(tài)代理

    在靜態(tài)代理的實現(xiàn)中,代理對象與被代理對象都必須實現(xiàn)同一個借口,在代理對象中可以實現(xiàn)日志記錄等相關(guān)服務(wù),并在需要的時候在呼叫被代理對象。如此代理對象中就可以僅保留業(yè)務(wù)相關(guān)職責(zé)。

    示例代碼:

    首先定義一個IHello接口:

    1public interface IHello {
    2        public void sayHello(String name);
    3}
    然后讓實現(xiàn)業(yè)務(wù)邏輯的HelloSpeaker類實現(xiàn)IHello接口:
    1public class HelloSpeaker implements IHello {
    2    public void sayHello(String name) {
    3            System.out.println("Hello, " + name);
    4    }

    5}
    將日志記錄功能放入代理對象中,代理對象同樣也要實現(xiàn)IHello接口:
     1import java.util.logging.*;
     2
     3public class HelloSpeakerProxy implements IHello {
     4    
     5    private Logger logger = Logger.getLogger(this.getClass().getName());
     6    private IHello helloObject;
     7    
     8    public HelloSpeakerProxy(IHello hello){;
     9        this.helloObject = hello;
    10    }

    11    public void sayHello(String name) {
    12        logger.log(Level.INFO, "before sayHello");
    13        helloObject.sayHello(name);
    14        logger.log(Level.INFO, "after sayHello");
    15    }

    16}
    編寫測試程序:
     1public class StaticProxyDemo {
     2    public static void main(String[] args) {
     3        HelloSpeakerProxy proxy = new HelloSpeakerProxy(new HelloSpeaker());
     4        proxy.sayHello("codingliyi");
     5    }

     6//    運行結(jié)果:
     7//    2009-11-7 21:21:55 SpringAOP.HelloSpeakerProxy sayHello
     8//    信息: before sayHello
     9//    Hello, codingliyi
    10//    2009-11-7 21:21:55 SpringAOP.HelloSpeakerProxy sayHello
    11//    信息: after sayHello
    12}

    靜態(tài)代理缺陷:代理對象的一個接口只服務(wù)于一種類型的被代理對象。如果要代理的方法很多,靜態(tài)代理就無法勝任。

    2. 動態(tài)代理

    JDK1.3之后加入了可協(xié)助開發(fā)動態(tài)代理功能的API,不必為特定對象與方法編寫特定的代理對象。使用動態(tài)代理,可以使得一個處理者(Handler)服務(wù)于各個對象。

    相關(guān)的接口和類有如下兩個:

    1.java.lang.reflect.InvocationHandler接口

    該接口僅定義了一個方法:

    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable

    其中,proxy指代理類,method是被代理的方法,args指方法的參數(shù)。

    2.java.lang.reflect.Proxy;

    該類最主要的方法:

    static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h)

    其中,loader指被代理類的類加載器;interfaces指被代理類實現(xiàn)的接口,h指方法調(diào)用的處理程序。

    動態(tài)代理的示例代碼如下:

    DynamicProxyHandler.java
     1public class DynamicProxyHandler implements InvocationHandler {
     2    private Object delegate;
     3    
     4    public DynamicProxyHandler(Object delegate){
     5        this.delegate = delegate;
     6    }

     7    
     8    public Object invoke(Object proxy, Method method, Object[] args)
     9            throws Throwable {
    10        System.out.println("調(diào)用方法前");
    11        Object result = method.invoke(delegate,args);
    12        System.out.println("調(diào)用方法后");
    13        return result;
    14    }

    15}
    DynamicProxyDemo.java
     1public class DynamicProxyDemo {
     2    public static void main(String[] args) {
     3        HelloSpeaker speaker = new HelloSpeaker();
     4        IHello hello = (IHello)Proxy.newProxyInstance(speaker.getClass().getClassLoader(), speaker.getClass().getInterfaces(), new DynamicProxyHandler(speaker));
     5        hello.sayHello("codingliyi");
     6    }

     7//    運行結(jié)果:
     8//    調(diào)用方法前
     9//    Hello, codingliyi
    10//    調(diào)用方法后
    11}

    動態(tài)代理的實戰(zhàn)步驟:
    a.    業(yè)務(wù)接口,一個Interface;
    b.    實現(xiàn)業(yè)務(wù)接口的類,即被代理類;
    c.    一個繼承了java.lang.reflect.InvocationHandler的Handler類,里面維持了一個被代理對象的引用(Object類型),實現(xiàn)invoke()方法;
    d.    使用Proxy.newProxyInstance()將Handler與被代理類關(guān)聯(lián),得到代理類,并強制轉(zhuǎn)化為接口類型;
    e.    調(diào)用該接口的方法。

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费国产在线视频| 亚洲精品无码久久久久APP| jizz免费在线观看| 亚洲AV中文无码乱人伦在线视色| 国产成人高清亚洲一区91| 国产精品另类激情久久久免费| 亚洲风情亚Aⅴ在线发布| 日韩一品在线播放视频一品免费| 亚洲av乱码中文一区二区三区| 国产精品冒白浆免费视频| 黄色a三级免费看| 91麻豆国产自产在线观看亚洲| a毛片免费观看完整| 久久久久亚洲Av片无码v| 99热这里只有精品6免费| 亚洲妓女综合网99| 毛片视频免费观看| 色视频在线观看免费| 中文字幕亚洲乱码熟女一区二区| 一个人看的www免费视频在线观看 一个人免费视频观看在线www | 免费人成在线观看视频播放| 处破女第一次亚洲18分钟| 国产精品jizz在线观看免费| 一区二区免费国产在线观看| 亚洲AV无码乱码国产麻豆| 1000部拍拍拍18勿入免费视频软件 | 色影音免费色资源| 亚洲av乱码中文一区二区三区| 国产亚洲成人在线播放va| 99精品视频在线观看免费播放| 日韩亚洲人成在线| 国产亚洲美女精品久久久| 四虎在线最新永久免费| 大桥未久亚洲无av码在线| 亚洲国产成人片在线观看无码| 国产精品色拉拉免费看| 一级毛片a免费播放王色电影 | 亚洲综合区小说区激情区| 97免费人妻在线视频| 日韩欧美亚洲中文乱码| 亚洲色欲久久久综合网|