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