java 代理實現方式




先講一下概念,代理,什麼是代理?

舉個例子吧。很多人喜歡在淘寶或者天貓上淘一些生活用品或者衣服,這個購買過程就產生了本文的重點,代理。你知道你購買的商家叫什麼名,但是不知道他後面的廠家是誰?這件衣服是哪個廠家賣給了你,你完全不知道,其實這個過程就是代理,廠家委託商家賣衣服給你,商家就是代理類,代理賣這個廠家這個品牌的衣服,廠家就是委託類,委託商家埋衣服。什麼北京區代理,黑龍江總代理,都是這個方式的。


代理分爲動態,和靜態。先說說靜態代理,

//代理接口類

public interface SpiderOrder {


//訂單1

public void crawlingSpider1();

//訂單2

public void crawlingSpider();

}

//委託類

public class SpiderOrderImpl implements SpiderOrder{


@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

System.out.println("訂單1-----");

}


@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

System.out.println("訂單2-----");

}


}

//靜態代理類

public class SpiderOrderProxy implements SpiderOrder{


private SpiderOrderImpl spiderOrderImpl;

public SpiderOrderProxy(SpiderOrderImpl spiderOrderImpl) {

super();

this.spiderOrderImpl = spiderOrderImpl;

}


@Override

public void crawlingSpider1() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider1();

System.out.println("具體的執行");

}


@Override

public void crawlingSpider() {

// TODO Auto-generated method stub

spiderOrderImpl.crawlingSpider();

System.out.println("具體的執行");

}


}

說明:你看這個靜態代理有啥缺點嗎? 代理接口新增一個方法,實現類要全都實現,靜態代理類也要全部都實現這個新增方法。你這接口方法少還行,項目大了,經常會變動的。還有就是這個你知道哪個類是代理類,可以直接去用,事先是知道的。如果不知道呢具體的代理類,如何呢?接下來講解動態代理類。


動態代理,利用了很多反射的技術知識,開始


//中介類

public class WorkInvocationHandler implements InvocationHandler{


private Object object;//代理類持有一個委託類對象

public WorkInvocationHandler(Object object) {

super();

this.object = object;

}


@Override

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

System.out.println(" 方法調用之前 ");

method.invoke(object, args);

System.out.println(" 方法調用之後 ");

return null; 

}

}


中介類必須實現InvoCationhandler類,來處理。當我們調用代理的具體的方法的時候,會統一的到中介類的invoke方法上,這樣我們可以在invoke方法上做具體的邏輯,根據不同的情況做不同的處理,參數Method是方法,proxy是具體的代理類。這個中介類的輸出是在這個代理類具體實現方法前,和方法後做具體的處理。


public class InvokeClient {


public static void main(String[] args) {

SpiderOrder spidOrder = new SpiderOrderImpl();

InvocationHandler invocation = new WorkInvocationHandler(spidOrder);

SpiderOrder proxySipderOrder = (SpiderOrder) Proxy.newProxyInstance(invocation.getClass().getClassLoader(), spidOrder.getClass().getInterfaces(), invocation);

System.out.println("輸出這個反射出來的proxySipderOrder" + proxySipderOrder.getClass().getName());

//這實際上回調用到

proxySipderOrder.crawlingSpider();

proxySipderOrder.crawlingSpider1();

}

}

會發現,中介類與代理類也構成了一個靜態代理關係,這個關係中,中介類是委託類,代理類是代理類。這樣做的好處就是將代理類與被代理對象分離開來,這樣我們可以在代理類與被代理類隨意組合。也就是說動態代理是由兩組靜態代理構成的,這也基本是原理了。自己品味一下這個JDK動態代理。

spring AOP是基本原理是動態代理,分爲jdk的動態代理,和CGLIB代理組成。







發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章