#JDK動力學和CGLIB動力學的區別
Spring AOP 中有兩種主要的動態方式,JDK 動態和 CGLIB 動態
JDK dynamic 只提供介面,不支援類。
1) JDK 將生成乙個動態類 $proxy*。在執行時class .
2)該類實現了目標類的介面,該類實現了介面的所有方法增強。
3)呼叫時,**類首先呼叫處理類進行增強,然後通過反射呼叫目標方法。從而實現AOP
如果類沒有實現介面,則 Spring AOP 選擇使用 CGLIB 來動態定位該類。
1)CGLIB的底層是通過ASM在執行時動態生成目標類的子類。(還有其他相關類,主要是為了提高呼叫時的效率)生成多個,
2)並且會覆蓋父類的所有方法進行增強,3)呼叫時,先通過類進行增強,然後直接呼叫父類的相應方法呼叫目標方法。從而實現AOP
CGLIB 通過繼承是動態的,因此如果乙個類被標記為 final,則無法使用 CGLIB 對其進行動畫處理。
除了生成目標子類之外,CGLIB 還有乙個 fastclass(路由類),該類可以(但不必)通過此類的方法呼叫進行擴充,而不會使 JDK 等方法呼叫增強功能失效。
很多人會比較JDK和CGLIB的效能,JDK動態生成類快,呼叫慢,CGLIB生成類慢,但後續呼叫。
速度快,在舊版本的 CGLIB 中比 JDK 快 10 倍左右,但實際上,每次版本公升級時,JDK 的速度都要高得多,而且。
CGLIB仍然步履蹣跚。
在JDK動態和CGLIB動態的實驗中,JDK7和8的動態效能在1W執行下比CGLIB好20%左右。
其他擴充套件。
1. 動態有什麼用**
他可以創造物件。
在原有**不變、原有不變的情況下,原有功能得到增強(有點像裝飾器模式)。
解耦允許您將業務功能與日誌分離。
二、兩種實現方式**
1) JDK動態**:
這是通過以下三個類實現的:proxy、method 和 invocationhandler。
要求目標類必須實現介面。
2)、CGLIB Dynamics**。
原則是繼承。
通過建立子類來重寫父類的方法,從而增強目標類方法。
3. JDK Dynamics** 演示**
開發步驟:建立目標類介面someservice
j**apackage com.mr.lee.service;
public interface someservice
override
public string doother()
為 InvocationHandler 介面建立乙個實現類,該介面實現對目標方法的增強。
j**apackage com.mr.lee.dao;
import j**a.lang.reflect.invocationhandler;
import j**a.lang.reflect.method;
實現 InvocationHandler 介面以增強目標方法的功能。
public class myinvocationhandler implements invocationhandler
override
public object invoke(object proxy, method method, object args) throws throwable
return method.invoke(target,args);等效於 someserviceimpldosome() 方法。
使用類似 jdk 的代理建立**物件,實現建立物件的能力。
j**apackage com.mr.lee;
import com.mr.lee.dao.myinvocationhandler;
import com.mr.lee.service.someservice;
import com.mr.lee.service.someserviceimpl;
import org.junit.test;
import org.springframework.context.applicationcontext;
import org.springframework.context.support.classpathxmlapplicationcontext;
import j**a.lang.reflect.invocationhandler;
import j**a.lang.reflect.proxy;
public class apptest
testpublic void shouldanswerwithtrue()
執行結果。 ``j**a
目前的執行方式是:dosome
當前執行時間:1664091059671
執行了 dosome 方法。
結束時間:1664091059671
目前的執行方式是:doother
執行了 doother 方法。
process finished with exit code 0
4. CGLIB新聞**。
APO的底層實現是動態的,AOP是動態的一種規範化。
原理是實現繼承:建立乙個子類,子類是**物件,目標類和方法一定不能是final的,