JDK代理和CGLIB代理 (springboot proxyTargetClass=true)
阿新 • • 發佈:2018-12-09
首先總結下兩種代理的區別:
jdk的Proxy代理(必須傳入介面) --spring預設使用
cglib(可以是類而非介面)
一:具體點我們看下官方文件關於代理機制的介紹:
Spring AOP使用JDK動態代理或CGLIB為給定目標物件建立代理。(預設使用JDK動態代理)。
如果被代理的目標物件已經實現了介面,則使用JDK動態代理。如果目標物件未實現任何介面,則會建立CGLIB代理。
如果要強制使用CGLIB代理(例如,代理目標物件的方法不僅僅是其介面實現的方法),您注意以下問題:
-
final
方法不建議使用,因為它們無法被覆蓋。 -
從Spring 3.2開始,不再需要將CGLIB新增到專案類路徑中。
要強制使用CGLIB代理,請將元素<aop:config>的
屬性proxy-target-class
值設定為true,如下所示:
<aop:config proxy-target-class="true"> <!-- other beans defined here... --> </aop:config>
二、原理區別:
java動態代理是利用反射機制生成一個實現代理介面的匿名類,在呼叫具體方法前呼叫InvokeHandler來處理。
而cglib動態代理是利用asm開源包,對代理物件類的class檔案載入進來,通過修改其位元組碼生成子類來處理。
1、如果目標物件實現了介面,預設情況下會採用JDK的動態代理實現AOP
2、如果目標物件實現了介面,可以強制使用CGLIB實現AOP
3、如果目標物件沒有實現了介面,必須採用CGLIB庫,spring會自動在JDK動態代理和CGLIB之間轉換