Comparing Spring AOP and AspectJ

AOP 概念

在咱們開始以前 , 讓咱們作一個快速、高級別審查的核心術語和概念 :html

  • 方面 — —標準 / 特徵代碼被分散在多個場所中的應用 , 一般不一樣於實際的業務邏輯 (例如 , 交易管理) 。各方面集中於特定的切割功能
  • Joinpoint –它的具體執行過程當中程序的執行等方法 , 調用構造函數或賦值域
  • 建議採起的行動方面在特定 Joinpoint
  • 切入點 — — Joinpoint 正則表達式來匹配的。每一個時間點加入任何匹配的切入點 , 這個切入點建議相關規定執行
  • 織造 – 的手續方面的針對性建議對象建立一個對象

Spring AOP 和 AspectJ

如今 , 讓咱們討論一下 Spring AOP 和 AspectJ 的軸線 — — 諸如能力、目標、編織、內部結構、鏈接點和質樸。web

能力和目標

簡單來講 , Spring AOP 和 AspectJ 有不一樣的目標。正則表達式

SpringAOP 是 AOP 的簡單實現 Spring IoC 來解決該問題 , 最多見的一類。它並不意圖做爲完整解決方案的 AOP- 它只能應用於被管理的 Bean 時 , Spring 容器。spring

另外一方面 ,AspectJ 是 AOP 技術的原始的 AOP 提供完整解決方案。它更爲魯棒 , 可是也明顯多於 Spring AOP 。同時 , 值得注意的是 , 能夠應用於全部的 AspectJ 域對象。編程

織造

Spring AOP 和 AspectJ 都使用了不一樣類型的編織行爲有關 , 嚴重影響其性能和易用性。瀏覽器

AspectJ 利用三種不一樣類型的編織 :架構

  1. 編譯時編織AspectJ 編譯器 : 輸入源代碼的應用方面咱們和咱們的生產和織造類文件做爲輸出
  2. 織造後編譯這也被稱爲二進制編織。它是用於現有類文件和 JAR 文件 , 咱們方面
  3. 裝載時織入這正是 : 像原來的二進制編織 , 與編織的差 , 直至類加載器加載到 JVM 中的類文件

更深刻的信息對 AspectJ 自己 ,看一下這篇文章框架

做爲使用 AspectJ 編譯器 classload 織造時間和時間 ,利用 Spring AOP 的運行時編織編程語言

與運行時編織 , 該編織方面在執行應用程序期間使用代理在目標物品 — — JDK 動態代理或使用代理 (在下面討論的點) :函數

內部結構和應用

Spring AOP 是一個基於代理的 AOP 框架。這意味着 , 爲了實現這些方面的目標對象 , 它建立代理對象。這是經過使用如下兩種方式 :

  1. JDK 的動態代理 AOP 方式優選爲彈簧。即便當目標對象實現一個接口 , 而後使用 JDK 動態代理
  2. CGLIB 代理 – 若是目標對象不實現接口 , 則代理可使用

咱們能夠更深刻地瞭解 Spring AOP 代理的機制官方文檔

AspectJ 中 , 另外一方面 , 起不到任何做用 , 由於類在運行時被編譯直接的方面。

Spring AOP 等不一樣 , 它不須要任何設計圖案。在織造方面 , 介紹了其稱爲編譯 AspectJ 編譯器 ( ajc ) , 編譯和運行程序 , 而後經過小的 (< 100K).

鏈接點

在 3.3 節中 , 咱們顯示 , 基於代理的 Spring AOP 模式。正由於如此 , 它須要 Java 類和子類的對象將橫切關注點應用。

但它具備侷限性。咱們不能將橫切關注點應用類別 (或方面) 的 「最終」 , 由於它們不能被重寫 , 從而它將致使運行異常。

這一樣適用於靜態和最終方法。彈簧方面不能應用 , 由於它們不能被重寫。所以 , 由於 Spring AOP 的這些限制 , 只支持方法執行鏈接點。

然而 ,AspectJ 編織將橫切關注點直接轉換成實際的代碼以前運行。Spring AOP 不一樣 , 它不須要對象的子類對象 , 並所以支持許多其餘的鏈接點。如下是對支持的鏈接點 :

Joinpoint Spring AOP 支持 AspectJ 支持
呼叫方法 沒有 是的
執行方法 是的 是的
調用構造函數 沒有 是的
執行構造函數 沒有 是的
執行靜態初始化器 沒有 是的
對象初始化 沒有 是的
參考場 沒有 是的
外勤任務 沒有 是的
執行處理程序 沒有 是的
執行建議 沒有 是的

值得注意的是在 spring aop 中 , 問題不是所謂的方法應用於同一類別。

這是由於 , 當咱們調用在同一個類中定義的方法 , 則不調用該方法 , Spring AOP 的代理提供。若是咱們須要這個功能 , 那麼咱們必須定義一個不一樣的咖啡豆中分離方法 , 或者使用 AspectJ 。

簡單

Spring AOP 是明顯更簡單 , 由於它不引入任何額外的編譯器或編織器之間的編譯過程。它使用運行時編織 , 所以咱們一般無縫集成與構建過程。雖然它看上去很簡單 , 它只經過彈簧託管 bean 。

然而 , 使用 AspectJ , 咱們須要採用 AspectJ 編譯器 ( ajc ) 和從新封裝庫 ( 除非咱們全部咱們切換到編譯後或裝入時編織的狀況下) 。

固然 , 比前者更復雜 , 由於它介紹了 AspectJ 工具 (包括 Java 編譯器 ( ajc ) 、調試器 (ajdb ) 、文件生成器 (ajdoc) 、瀏覽器程序 ajbrowser 結構 ()) , 咱們須要集成或與 IDE 中的構建工具。

性能

就表演而言 ,編譯時編織的運行時編織。Spring AOP 是一個基於代理的架構 , 使得代理的存在時啓動應用。此外 , 還有幾個方面每一個方法調用 , 這影響了性能。

另外一方面 , AspectJ 中的方面編織到主代碼在應用程序執行以前 , 沒有額外的運行時開銷 , 不像 Spring AOP 。

因爲這些緣由 ,基準AspectJ 是幾乎認爲大約 8 到 35 倍 Spring AOP 。

摘要

這個錶快速彙總了主要差別, Spring AOP 和 AspectJ 之間進行 :

Spring AOP AspectJ
用純 Java 使用 Java 編程語言的擴展
不須要單獨的編碼過程 須要 AspectJ 編譯器 ( ajc ) 除非 LTW 設置
惟一可用的運行時編織 織造運行時不可用。支持編譯 , 編譯後 , 加載時織入
更強大 — — 只支持織制方法 更可編織更強大 — — 字段、方法、構造函數、靜態初始化器 , 最終類 / 方法等 …
能夠只針對 bean 的 Spring 容器管理 能夠實現對全部域對象
僅支持執行切入點方法 全部支持的切入點
代理建立的目標對象 , 同時也應用在這些代理 方面的編織直接轉換成代碼以前執行應用程序 (在運行時以前)
AspectJ 慢得多 更好的性能
簡單易學適用 相對更復雜的是 Spring AOP

選擇合適的框架

若是咱們在全部分析的論點 , 咱們就會明白 , 這根本沒有那麼一個框架比另外一種更好。

簡單來講 , 在很大程度上取決於咱們的選擇要求 :

  • 框架 : 若是不使用 Spring 框架 , 而後咱們就別無選擇 , 只能放棄這個想法 , 由於它使用的是 Spring AOP 不能管理任何彈簧以外的容器。然而 , 若是咱們應用所有建立使用 Spring 框架 , 而後咱們可使用 Spring AOP 的簡單的學習和應用
  • 靈活性 : Joinpoint 有限的支持 , 是不完整的 Spring AOP 面向方面編程 (AOP) 的解決方案 , 但它解決了問題 , 最多見的一類。但若是咱們想要更深刻地挖掘和利用 AOP 以其最大能力的支持 , 但願從普遍可用的鏈接點 , 則是選擇了 AspectJ
  • 表現 : 若是咱們使用有限的方面 , 則有輕微的性能差別。但有時會因申請以上幾方面。咱們不但願使用這種運行時編織的狀況下 , 仍是選擇了 AspectJ 。AspectJ 是 8 至 35 倍 Spring AOP
  • 最好的 : 這些框架的徹底兼容。咱們老是能夠利用 Spring AOP 和 AspectJ 使用時仍可能獲得支撐的鏈接點不支持由前任
相關文章
相關標籤/搜索