背景:雖然自己了解這兩種代理的區別,但是面試時候還是答的很模糊,需要好好總結。
前言
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"/>)。
ps:總結的很到位