Spring AOP 功能與目標

Spring AOP 是以純 Java 實作。不需要特殊的編譯過程。Spring AOP 不需要控制類別載入器階層,因此適用於 Servlet 容器或應用程式伺服器中使用。

Spring AOP 目前僅支援方法執行連接點(建議 Spring Bean 上方法的執行)。欄位攔截尚未實作,但新增欄位攔截支援不會破壞核心 Spring AOP API。如果您需要建議欄位存取和更新連接點,請考慮使用 AspectJ 等語言。

Spring AOP 的 AOP 方法與大多數其他 AOP 框架不同。其目標不是提供最完整的 AOP 實作(儘管 Spring AOP 功能相當強大)。相反地,其目標是在 AOP 實作和 Spring IoC 之間提供緊密整合,以協助解決企業應用程式中的常見問題。

因此,舉例來說,Spring Framework 的 AOP 功能通常與 Spring IoC 容器結合使用。切面透過使用一般的 Bean 定義語法進行配置(儘管這允許強大的「自動代理」功能)。這與其他 AOP 實作有著關鍵的不同。您無法使用 Spring AOP 輕鬆或有效率地完成某些事情,例如建議非常細微的物件(通常是網域物件)。在這種情況下,AspectJ 是最佳選擇。然而,我們的經驗是,Spring AOP 為大多數企業 Java 應用程式中適合 AOP 的問題提供了絕佳的解決方案。

Spring AOP 從未試圖與 AspectJ 競爭以提供全面的 AOP 解決方案。我們認為,諸如 Spring AOP 之類的基於 Proxy 的框架和諸如 AspectJ 之類的全功能框架都很有價值,並且它們是互補的,而不是競爭關係。Spring 將 Spring AOP 和 IoC 與 AspectJ 無縫整合,以在一致的基於 Spring 的應用程式架構中啟用 AOP 的所有用途。這種整合不會影響 Spring AOP API 或 AOP Alliance API。Spring AOP 保持向後相容性。請參閱以下章節以了解 Spring AOP API 的討論。

Spring Framework 的核心原則之一是非侵入性。這個概念是指您不應被迫將框架特定的類別和介面引入您的業務或網域模型中。然而,在某些地方,Spring Framework 確實讓您可以選擇將 Spring Framework 特定的相依性引入您的程式碼庫中。提供這種選擇的基本原理是,在某些情況下,以這種方式讀取或編寫某些特定功能可能會更容易。但是,Spring Framework(幾乎)總是為您提供選擇:您可以自由地做出明智的決定,以決定哪種選項最適合您的特定用例或情境。

與本章相關的一個這樣的選擇是選擇哪個 AOP 框架(以及哪個 AOP 樣式)。您可以選擇 AspectJ、Spring AOP 或兩者。您也可以選擇 @AspectJ 註解樣式方法或 Spring XML 配置樣式方法。本章選擇首先介紹 @AspectJ 樣式方法不應被視為 Spring 團隊偏好 @AspectJ 註解樣式方法勝過 Spring XML 配置樣式方法的跡象。

請參閱選擇要使用的 AOP 宣告樣式,以更完整地討論每種樣式的優點和缺點。