Java入門(18)靜態代理和動態代理

序言

1.什麼是靜態代理和動態代理

2.爲什麼需要靜態代理和動態代理?使用場景

3.demo演示靜態代理和動態代理

4.靜態代理存在的問題?

5.JDK動態代理:存在的問題?

6.cglib動態代理:cglib是什麼?常見的動態代理?爲什麼要用動態代理?

7.what why how

靜態代理

靜態就是說我們的代理類都在程序員編碼階段就已經實現了,通過編譯器後可以直接編譯成class文件然後加載到JVM內存,程序運行時,class就已經存在了。

demo演示靜態代理如何實現

靜態代理存在的問題:

靜態代理解決了代碼耦合的問題,但也帶來了新的挑戰:需要手動創建和維護大量的代理類。每個控制器都需要增加一個代理類,這意味着在項目中會有許多*Proxy類存在。

此外,當RoleController添加新的方法時,還需要在相應的代理類中進行實現。在這種情況下,我們會想,如果代理類能夠自動生成就太好了。於是,動態代理就應運而生。

動態代理-JDK動態代理

 

JDK動態代理的問題

JDK動態代理要求被代理的類實現某個接口,而CGLIB則沒有這個限制。

動態代理-CGLib動態代理

那既然有了JDK動態代理,爲什麼還需要cglib動態代理?

因爲JDK動態代理必須要綁定接口(這是一個缺陷,cglib彌補了這一缺陷)

下面就說一下 cglib 動態代理。

  1. CGLIB可以代理那些沒有實現接口的類,使得它更加靈活,可以代理更廣泛的類。

  2. 執行速度:CGLIB在目標方法的執行速度上更快。這是因爲CGLIB採用了一種稱爲FastClass的機制,它通過生成的代理類直接調用目標方法,避免了一些額外的方法調用,從而提高了執行效率。相比之下,JDK動態代理需要通過反射調用目標方法,會引入一些性能開銷。

小結

CGLIB是一個用於生成代理類的開源庫,它與JDK自帶的動態代理在一些方面有所不同,主要體現在以下幾點:

  1. 接口要求:JDK動態代理要求被代理的類實現某個接口,而CGLIB則沒有這個限制。CGLIB可以代理那些沒有實現接口的類,使得它更加靈活,可以代理更廣泛的類。

  2. 執行速度:CGLIB在目標方法的執行速度上更快。這是因爲CGLIB採用了一種稱爲FastClass的機制,它通過生成的代理類直接調用目標方法,避免了一些額外的方法調用,從而提高了執行效率。相比之下,JDK動態代理需要通過反射調用目標方法,會引入一些性能開銷。

需要注意的是,CGLIB通過生成繼承自目標類的子類來實現代理,因此目標類和目標方法不能被聲明爲final,否則CGLIB無法生成代理類。

常見的動態代理

在代理類庫中,我們經常接觸到的是JDK動態代理和前文提到的CGLIB。這兩個類庫都能在運行時生成代理類,並被廣泛應用於Spring的AOP(面向切面編程)中。

除了JDK動態代理和CGLIB之外,還存在其他一些第三方類庫,如Javassist和AspectJ,它們不僅可以在運行時生成代理類,還可以在編譯時生成代理類。這些類庫提供了更多的靈活性和功能,但在本文中不作深入討論。

Spring框架的AOP模塊在實現上使用了JDK動態代理和CGLIB兩種技術。對於實現了接口的類,Spring默認使用JDK動態代理來生成代理類;而對於沒有實現接口的類,Spring會使用CGLIB來生成代理類。這樣,Spring能夠根據目標類的特性選擇最合適的代理方式。

 AspectJ

AspectJ是目前作爲 AOP (Aspect-Oriented Programming 面向切面編程) 實現的一種最有效的解決方案。

 

爲什麼要用動態代理

 

 

資料

https://www.cnblogs.com/cosimo/p/17938521

cglib動態代理的使用和分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章