序言
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 動態代理。
-
CGLIB可以代理那些沒有實現接口的類,使得它更加靈活,可以代理更廣泛的類。
-
執行速度:CGLIB在目標方法的執行速度上更快。這是因爲CGLIB採用了一種稱爲FastClass的機制,它通過生成的代理類直接調用目標方法,避免了一些額外的方法調用,從而提高了執行效率。相比之下,JDK動態代理需要通過反射調用目標方法,會引入一些性能開銷。
小結
CGLIB是一個用於生成代理類的開源庫,它與JDK自帶的動態代理在一些方面有所不同,主要體現在以下幾點:
-
接口要求:JDK動態代理要求被代理的類實現某個接口,而CGLIB則沒有這個限制。CGLIB可以代理那些沒有實現接口的類,使得它更加靈活,可以代理更廣泛的類。
-
執行速度: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