1. 程式人生 > >Spring中AOP實現的兩種方式之JDK和cglib的動態代理

Spring中AOP實現的兩種方式之JDK和cglib的動態代理

AOP的實現原理: 都是基於代理模式,都是生成一個大代理物件 靜態AOP: AspectJ實現的AOP, 將切面程式碼直接編譯到Java類檔案中 --- 實現: JDK提供的動態代理技術 動態AOP: 將切面程式碼進行動態織入實現的AOP --- Spring的AOP為動態AOP --- 實現: CGLIB(動態位元組碼增強技術) cglib建立的動態代理物件效能比JDK建立效能高很多,但是cglib在建立代理物件的時候所花費時間卻是比jdk多的多,所以對於單例的物件,其不需要頻繁的建立物件,用cglib更合適,反之,用jdk更好。同時,由於cglib是採用動態建立子類的方法,對於final方法,無法進行代理。 JDK動態代理: --- InvocationHandler 和 Proxy.newProxyInstance() --- 動態代理的基本原理為反射 + 多型 + 聚合 InvocationHandler是一個介面,通過實現該介面定義橫切邏輯,並通過反射機制呼叫目標類的程式碼,動態將橫切邏輯和業務邏輯編制在一起。 Proxy利用InvocationHandler動態建立一個符合某一介面的例項,生成目標類的代理物件 JDK動態代理要求被代理者實現一個介面,只有介面中的方法才能被代理, 其方法是,將被代理物件注入到一箇中間物件,而中間物件實現InvocationHandler介面, 在實現該介面時,可以在被代理物件呼叫它的方法時,在呼叫前後插入一些程式碼, Proxy.newProxyInstance()能夠利用中間物件來生產代理物件,插入的程式碼就是切面程式碼 侷限: 被代理的物件必須實現介面,而且只有介面中的方法才能被代理

cglib動態代理:--- 位元組碼生成技術 實現 MethodInterceptor介面,重寫其 interceptor()方法 CGLib採用非常底層的位元組碼技術,可以為一個類建立子類,並在子類中採用方法攔截的技術攔截所有父類方法的呼叫,並順勢織入橫切邏輯 繼承被代理物件,然後重寫被代理的方法,在覆蓋該方法時,插入自己的程式碼, 因為需要重寫被代理物件的方法,要求:被代理的方法不能使final方法,因為final方法不能被覆蓋

  • 通過jdk的動態代理:jdk的動態代理是基於介面的,必須實現了某一個或多個任意接口才可以被代理,並且只有這些介面中的方法會被代理。
  • 通過cglib動態代理:cglib是針對類來實現代理的,他的原理是對指定的目標類生成一個子類,並覆蓋其中的方法實現增強,但因為採用的是繼承,所以不能對final修飾的類進行代理。

參考blog地址 : 點選開啟連結