選擇要使用的 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 註解樣式。 如果切面在您的設計中扮演重要角色,並且您可以使用 AspectJ 開發工具 (AJDT) Eclipse 外掛程式,則 AspectJ 語言語法是較佳的選擇。 它更清晰、更簡單,因為該語言是專門為編寫切面而設計的。 如果您不使用 Eclipse,或者只有少數幾個切面在您的應用程式中沒有扮演主要角色,您可能需要考慮使用 @AspectJ 樣式,堅持在 IDE 中進行常規 Java 編譯,並在您的建置 Script 中新增切面織入階段。

@AspectJ 還是 XML 用於 Spring AOP?

如果您選擇使用 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 樣式。