靜態代理、JDK動態代理和CGLib動態代理之前的區別


  昨天看了一天的代理方面的知識,剛開始看的時候沒看出什么花頭來,感覺不實用。一大堆的東西,還不如直接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修飾的類進行代理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM