先講一下概念,代理,什麼是代理?
舉個例子吧。很多人喜歡在淘寶或者天貓上淘一些生活用品或者衣服,這個購買過程就產生了本文的重點,代理。你知道你購買的商家叫什麼名,但是不知道他後面的廠家是誰?這件衣服是哪個廠家賣給了你,你完全不知道,其實這個過程就是代理,廠家委託商家賣衣服給你,商家就是代理類,代理賣這個廠家這個品牌的衣服,廠家就是委託類,委託商家埋衣服。什麼北京區代理,黑龍江總代理,都是這個方式的。
代理分爲動態,和靜態。先說說靜態代理,
//代理接口類
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代理組成。