昨天看了一天的代理方面的知識,剛開始看的時候沒看出什么花頭來,感覺不實用。一大堆的東西,還不如直接new出來,然后調用方法。后來仔細研究了一下AOP(面向切面)的思想,才發現代理的用處實在太大了。現在很多框架包括Spring等,都用到了代理這方面的知識,什么是代理?引用網上的例子,就是一個人去買房子,可以直接去買房子,如果直接去買房子的話就得准備很多的東西,然后跑很多地方,這時候房產中介就出現了,我們可以把買房子的事交給中介,讓中介做我們的代理,這樣我們會省力很多,不需要關心房子是怎么買下來的。這里先簡單的描述一下三種代理的區別吧
1、靜態代理:靜態代理中的代理類,需要我們自己寫。代碼如下:
首先是接口類:
然后是委托類
最后是代理類:
當然,這里我把實現代理的過程寫在代理類的main方法中了。從上面的代碼中可以看出這個靜態代理類,非常的笨。如果你想讓這個代理類代理多個類的話,代碼會越來越多。所以,這時候我們就需要一個動態的代理類;
2、JDK動態代理類:
JDK動態代理類實現了InvocationHandler接口。在重寫的invoke方法中可以看出,JDK動態代理的基礎是反射(method.invoke(對象,參數)),還好反射看的比較多,到現在還記得。在這里需要提到的是Proxy.newProxyInstance(),這個方法。字面上的意思是 新建一個代理類的實例,這一點就和靜態代理不同了。里面的參數有三個 類加載器、所有的接口,得到InvocationHandler接口的子類實例。這就是JDK動態代理,該代理有以下幾種特點:
1、Interface:對於JDK Proxy,業務類是需要一個Interface的,這是一個缺陷;
2、Proxy:Proxy類是動態產生的,這個類在調用Proxy.newProxyInstance()方法之后,產生一個Proxy類的實力。實際上,這個Proxy類也是存在的,不僅僅是類的實例,這個Proxy類可以保存在硬盤上;
3、Method:對於業務委托類的每個方法,現在Proxy類里面都不用靜態顯示出來
4、InvocationHandler:這個類在業務委托類執行時,會先調用invoke方法。invoke方法在執行想要的代理操作,可以實現對業務方法的再包裝。
以上就是JDK動態代理
3、CGLib動態代理:上面的JDK Proxy只能代理實現了接口的類,而不能實現接口的類就不能實現JDK代理。這時候就需要CGLib動態代理類
這里需要注意的是實現MethodIntercetor接口,必須導入cglib-nodep-2.1_3.jar這個包。CGLib是針對類來實現代理的,他的原理是對指定的目標生成一個子類,並覆蓋其中方法實現增強,但因為采用的是繼承,所以不能對final修飾的類進行代理。