Spring AOP 兩種動態代理機制

Spring AOP 使用動態代理技術在 運行期 織入增強的代碼。其使用的動態代理機制有如下兩種:

  1. 基於 JDK 的動態代理;
  2. 基於 CGLib 的動態代理;

之所以需要兩種代理機制,很大程度上是因爲 JDK 本身只提供接口的代理,而不支持類的代理;而 CGLib 很好的彌補了這點,它通過創建子類,在子類中攔截父類的方法並織入橫切邏輯,實現對類的代理,但是其不能對目標類中的 final 或 private 方法進行代理,因爲被 final 或 private 修飾的方法不能被繼承。

 

二者比較及如何選擇:

CGLib 動態代理運行性能優於 JDK 動態代理,但是其創建代理對象時所花費的時間比 JDK 動態代理多。 所以對於 singleton 的代理對象或者具有實例池的代理,比較適合使用 CGLib 動態代理(因爲無需頻繁的創建代理對象),反之則使用 JDK 動態代理。

注:在 Spring 配置文件中,proxy-target-class 屬性(是否對類進行代理)設置爲 true 時,使用 CGLib 動態代理。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章