1. 程式人生 > >java的jdk動態代理和cglib動態代理區別

java的jdk動態代理和cglib動態代理區別

java動態代理是利用反射機制生成一個實現代理介面的匿名類,在呼叫具體方法前呼叫InvokeHandler來處理。而cglib動態代理是利用asm開源包,對代理物件類的class檔案載入進來,通過修改其位元組碼生成子類來處理。
1、如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP
2、如果目標物件實現了介面,可以強制使用CGLIB實現AOP
3、如果目標物件沒有實現了介面,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換

Spring aop 是通過代理實現的,代理有靜態代理,jdk動態代理和cglib動態代理。
靜態代理有一個弊端,需要為每一個目標類建立一個代理類,如果需要代理的物件很多的話,就得編寫相應的代理類,於是jdk動態代理出現了,它主要用了 java.lang.reflect.Proxy類和java.lang.reflect.InvocationHandler介面。