JDK和CGLIB動態代理區別


背景:雖然自己了解這兩種代理的區別,但是面試時候還是答的很模糊,需要好好總結。

前言
JDK動態代理實現原理(jdk8):https://blog.csdn.net/yhl_jxy/article/details/80586785

CGLIB動態代理實現原理:https://blog.csdn.net/yhl_jxy/article/details/80633194

定義

JDK動態代理
利用攔截器(攔截器必須實現InvocationHanlder)加上反射機制生成一個實現代理接口的匿名類

在調用具體方法前調用InvokeHandler來處理。

CGLiB動態代理
利用ASM開源包,對代理對象類的class文件加載進來,通過修改其字節碼生成子類來處理

實現CGLIB動態代理必須實現MethodInterceptor(方法攔截器)接口

區別

jdk只能針對接口不能針對類實現代理。

CGLib通過繼承方式實現代理。所以類或方法最好不要聲明成final,對於final類或方法,是無法繼承的。

Spring如何選擇用JDK還是CGLiB?

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

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

3)可以強制使用CGlib(在spring配置中加入<aop:aspectj-autoproxy proxy-target-class="true"/>)。


JDK和CGLIB動態代理區別

ps:總結的很到位


免責聲明!

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



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