代理,是動態和靜態的嗎?

代理模式是什麼?

代理模式是常用的結構型設計模式之一。 代理模式:給某一個對象提供一個代理或佔位符,並由代理對象來控制對原對象的訪問。

java種代理分為: 靜態代理和動態代理。 動態代理又可以由兩種方式來實現: jdk動態代理、cglib動態代理

靜態代理:

寫一個增強類實現 被增強類實現的所有接口,需要把被增強類的引用獲取到

前提條件:

①必須知道要增強的接口 【可以不知道實現類,但必須知道接口】

②必須能夠獲取被增強類 引用

缺點:

①如果接口中的無關方法過多,浪費大量時間去實現很多無關方法【解決:①動態代理②繼承已經有的包裝類】

②必須有接口!

③不靈活,需要創建 增強類

優點:①執行效率高

JDK動態代理:

前提條件:

①必須知道要增強的接口

②必須用Proxy.newProxyInstance創建代理對象

③動態代理只能增強接口中定義的方法

動態代理實現原理: 用動態代理其實是重新生成了一個代理類, 這個代理類和原類 實現了同樣的接口。

代理,是動態和靜態的嗎?

JDK Proxy 生成對象的步驟如下: ​ 1、拿到被代理對象的引用,並且獲取到它的所有的接口,反射獲取。 ​ 2、JDK Proxy 類重新生成一個新的類、同時新的類要實現被代理類所有實現的所有的接 口。 ​ 3、動態生成 Java 代碼,把新加的業務邏輯方法由一定的邏輯代碼去調用(在代碼中體 現)。 ​ 4、編譯新生成的 Java 代碼.class。 ​ 5、再重新加載到 JVM 中運行。

cglib動態代理:

CGLIB是針對類實現代理,主要是對指定的類生成一個子類,覆蓋其中的方法(繼承)

CGLib 動態代理執行代理方法效率之所以比 JDK 的高是因為 Cglib 採用了 FastClass 機制,它的原理簡單來說就是:為代理類和被代理類各生成一個 Class,這個 Class 會為代理類或被代理類的方法分配一個 index(int 類)。這個 index 當做一個入參,FastClass就可以直接定位要調用的方法直接進行調用,這樣省去了反射調用,所以調用效率比 JDK動態代理通過反射調用高。

兩種動態代理的區別?

CGLib 和 JDK 動態代理對比

1. JDK 動態代理是實現了被代理對象的接口,CGLib 是繼承了被代理對象。 ​ 2.JDK 和 CGLib 都是在運行期生成字節碼,JDK 是直接寫 Class 字節碼,CGLib 使用 ASM框架寫 Class 字節碼,Cglib 代理實現更復雜,生成代理類比 JDK 效率低。 ​ 3.JDK 調用代理方法,是通過反射機制調用,CGLib 是通過 FastClass 機制直接調用方法, CGLib 執行效率更高。

spring 中的動態代理

Spring 利用動態代理實現 AOP 有兩個非常重要的類,一個是 JdkDynamicAopProxy 類和 CglibAopProxy 類。


代理,是動態和靜態的嗎?

Spring在選擇用JDK還是CGLiB的依據:

(1)當Bean實現接口時,Spring就會用JDK的動態代理

(2)當Bean沒有實現接口時,Spring使用CGlib是實現

  (3)可以強制使用CGlib(在spring配置中加入<aspectj-autoproxy>)


大家好,我是小勁,專注分享java知識點,如有總結不到位的,歡迎小夥伴指點。感謝大家閱讀,歡迎點贊、轉發...


分享到:


相關文章: