在咱們開始以前 , 讓咱們作一個快速、高級別審查的核心術語和概念 :html
如今 , 讓咱們討論一下 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 利用三種不一樣類型的編織 :架構
更深刻的信息對 AspectJ 自己 ,看一下這篇文章。框架
做爲使用 AspectJ 編譯器 classload 織造時間和時間 ,利用 Spring AOP 的運行時編織。編程語言
與運行時編織 , 該編織方面在執行應用程序期間使用代理在目標物品 — — JDK 動態代理或使用代理 (在下面討論的點) :函數
Spring AOP 是一個基於代理的 AOP 框架。這意味着 , 爲了實現這些方面的目標對象 , 它建立代理對象。這是經過使用如下兩種方式 :
咱們能夠更深刻地瞭解 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 |
若是咱們在全部分析的論點 , 咱們就會明白 , 這根本沒有那麼一個框架比另外一種更好。
簡單來講 , 在很大程度上取決於咱們的選擇要求 :