1. 程式人生 > >JDK代理和CGLIB代理 (springboot proxyTargetClass=true)

JDK代理和CGLIB代理 (springboot proxyTargetClass=true)

    首先總結下兩種代理的區別:

         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之間轉換