選擇要使用的 AOP 宣告樣式
一旦你決定了切面是實現給定需求的最佳方法,你如何選擇使用 Spring AOP 還是 AspectJ,以及選擇 Aspect 語言(程式碼)風格、@AspectJ 註解風格還是 Spring XML 風格?這些決定受到許多因素的影響,包括應用程式需求、開發工具以及團隊對 AOP 的熟悉程度。
Spring AOP 還是完整的 AspectJ?
使用最簡單可行的方案。Spring AOP 比使用完整的 AspectJ 更簡單,因為它不需要在你的開發和構建過程中引入 AspectJ 編譯器/織入器。如果你只需要通知 Spring bean 上操作的執行,Spring AOP 是正確的選擇。如果你需要通知不由 Spring 容器管理的物件(例如,通常是領域物件),則需要使用 AspectJ。如果你希望通知除簡單方法執行之外的連線點(例如,欄位獲取或設定連線點等),也需要使用 AspectJ。
當你使用 AspectJ 時,可以選擇 AspectJ 語言語法(也稱為“程式碼風格”)或 @AspectJ 註解風格。如果切面在你的設計中扮演重要角色,並且你能夠使用 Eclipse 的 AspectJ 開發工具 (AJDT) 外掛,那麼 AspectJ 語言語法是首選。它更清晰、更簡單,因為該語言是專門為編寫切面而設計的。如果你不使用 Eclipse,或者只有少量切面在應用程式中不扮演主要角色,你可能需要考慮使用 @AspectJ 風格,堅持在 IDE 中進行常規 Java 編譯,並在構建指令碼中新增一個切面織入階段。
Spring AOP 中使用 @AspectJ 還是 XML?
如果你選擇使用 Spring AOP,你可以選擇 @AspectJ 或 XML 風格。這兩種風格各有優缺點。
XML 風格可能對現有的 Spring 使用者最為熟悉,並且它由真正的 POJO 支援。當使用 AOP 作為配置企業服務的工具時,XML 可以是一個不錯的選擇(一個很好的測試是,你是否認為切點表示式是你可能想要獨立更改的配置的一部分)。使用 XML 風格,從你的配置中可以更清楚地看出系統中存在哪些切面。
XML 風格有兩個缺點。首先,它不能完全在一個地方封裝它所解決的需求的實現。DRY 原則指出,系統中的任何知識都應該有一個單一、明確、權威的表示。當使用 XML 風格時,關於需求如何實現的知識分散在支援 bean 類的宣告和配置檔案中的 XML 中。當使用 @AspectJ 風格時,此資訊封裝在一個模組中:切面。其次,XML 風格在表達能力上比 @AspectJ 風格稍有限制:只支援“單例”切面例項化模型,並且無法組合在 XML 中宣告的命名切點。例如,在 @AspectJ 風格中,你可以這樣寫:
-
Java
-
Kotlin
@Pointcut("execution(* get*())")
public void propertyAccess() {}
@Pointcut("execution(com.xyz.Account+ *(..))")
public void operationReturningAnAccount() {}
@Pointcut("propertyAccess() && operationReturningAnAccount()")
public void accountPropertyAccess() {}
@Pointcut("execution(* get*())")
fun propertyAccess() {}
@Pointcut("execution(com.xyz.Account+ *(..))")
fun operationReturningAnAccount() {}
@Pointcut("propertyAccess() && operationReturningAnAccount()")
fun accountPropertyAccess() {}
在 XML 風格中,你可以宣告前兩個切點
<aop:pointcut id="propertyAccess"
expression="execution(* get*())"/>
<aop:pointcut id="operationReturningAnAccount"
expression="execution(com.xyz.Account+ *(..))"/>
XML 方法的缺點是,你不能透過組合這些定義來定義 accountPropertyAccess 切點。
@AspectJ 風格支援額外的例項化模型和更豐富的切點組合。它具有將切面保持為模組化單元的優點。它還具有 @AspectJ 切面可以被 Spring AOP 和 AspectJ 理解(並因此被消費)的優點。因此,如果你以後決定需要 AspectJ 的功能來實現其他需求,你可以輕鬆地遷移到經典的 AspectJ 設定。通常,Spring 團隊更喜歡 @AspectJ 風格用於除簡單企業服務配置之外的自定義切面。