天天看點

Spring的兩種動态代理:Jdk和Cglib 的差別和實作

一、原理差別:

java動态代理是利用反射機制生成一個實作代理接口的匿名類,在調用具體方法前調用InvokeHandler來處理。

而cglib動态代理是利用asm開源包,對代理對象類的class檔案加載進來,通過修改其位元組碼生成子類來處理。

1、如果目标對象實作了接口,預設情況下會采用JDK的動态代理實作AOP 

2、如果目标對象實作了接口,可以強制使用CGLIB實作AOP 

3、如果目标對象沒有實作了接口,必須采用CGLIB庫,spring會自動在JDK動态代理和CGLIB之間轉換

如何強制使用CGLIB實作AOP?

 (1)添加CGLIB庫,SPRING_HOME/cglib/*.jar

 (2)在spring配置檔案中加入<aop:aspectj-autoproxy proxy-target-class="true"/>

JDK動态代理和CGLIB位元組碼生成的差別?

 (1)JDK動态代理隻能對實作了接口的類生成代理,而不能針對類

 (2)CGLIB是針對類實作代理,主要是對指定的類生成一個子類,覆寫其中的方法

   因為是繼承,是以該類或方法最好不要聲明成final 

二、代碼實作

使用者管理接口

Spring的兩種動态代理:Jdk和Cglib 的差別和實作
Spring的兩種動态代理:Jdk和Cglib 的差別和實作

使用者管理接口實作類

Spring的兩種動态代理:Jdk和Cglib 的差別和實作
Spring的兩種動态代理:Jdk和Cglib 的差別和實作

JDK動态代理

Spring的兩種動态代理:Jdk和Cglib 的差別和實作
Spring的兩種動态代理:Jdk和Cglib 的差別和實作

JDK動态代理運作結果

Spring的兩種動态代理:Jdk和Cglib 的差別和實作

Cglib動态代理(需要導入兩個jar包,asm-5.2.jar,cglib-3.2.5.jar。版本自行選擇)

Spring的兩種動态代理:Jdk和Cglib 的差別和實作
Spring的兩種動态代理:Jdk和Cglib 的差別和實作

Cglib動态代理運作結果

Spring的兩種動态代理:Jdk和Cglib 的差別和實作

 有什麼問題可以留言讨論!