1. 程式人生 > >Spring—AOP兩種代理機制對比(JDK和CGLib動態代理)

Spring—AOP兩種代理機制對比(JDK和CGLib動態代理)

Sprign 動態代理機制

Spirng的AOP的動態代理實現機制有兩種,分別是:

1)JDK動態代理:

具體實現原理:

1、通過實現InvocationHandlet介面建立自己的呼叫處理器

2、通過為Proxy類指定ClassLoader物件和一組interface來建立動態代理

3、通過反射機制獲取動態代理類的建構函式,其唯一引數型別就是呼叫處理器介面型別

4、通過建構函式建立動態代理類例項,構造時呼叫處理器物件作為引數參入

JDK動態代理是面向介面的代理模式,如果被代理目標沒有介面那麼Spring也無能為力,

Spring通過java的反射機制生產被代理介面的新的匿名實現類,重寫了其中AOP的增強方法。

2、CGLib動態代理

CGLib是一個強大、高效能的Code生產類庫,可以實現執行期動態擴充套件java類,Spring在執行期間通過CGlib繼承要被動態代理的類,重寫父類的方法,實現AOP面向切面程式設計呢。

兩者對比:

JDK動態代理是面向介面,在建立代理實現類時比CGLib要快,建立代理速度快。

CGLib動態代理是通過位元組碼底層繼承要代理類來實現(如果被代理類被final關鍵字所修飾,那麼抱歉會失敗),在建立代理這一塊沒有JDK動態代理快,但是執行速度比JDK動態代理要快。

使用注意:

如果要被代理的物件是個實現類,那麼Spring會使用JDK動態代理來完成操作(Spirng預設採用JDK動態代理實現機制)

如果要被代理的物件不是個實現類那麼,Spring會強制使用CGLib來實現動態代理。

那麼如何選擇的使用代理機制了?

通過配置Spring的中<aop:config>標籤來顯示的指定使用動態代理機制 proxy-target-class=true表示使用CGLib代理,如果為false就是預設使用JDK動態代理