AOP 概念

讓我們首先定義一些核心的 AOP 概念和術語。這些術語並非 Spring 特有。不幸的是,AOP 術語並不特別直觀。然而,如果 Spring 使用自己的術語,那將更加令人困惑。

  • 切面(Aspect):對橫跨多個類的關注點進行模組化。事務管理是企業級 Java 應用程式中一個很好的橫切關注點示例。在 Spring AOP 中,切面透過使用常規類(基於 schema 的方法)或使用 @Aspect 註解的常規類(@AspectJ 風格)來實現。

  • 連線點(Join point):程式執行過程中的某個點,例如方法的執行或異常的處理。在 Spring AOP 中,連線點始終表示方法執行。

  • 通知(Advice):切面在特定連線點採取的行動。不同型別的通知包括“環繞(around)”、“前置(before)”和“後置(after)”通知。(通知型別將在後面討論。)許多 AOP 框架,包括 Spring,將通知建模為攔截器,並在連線點周圍維護一個攔截器鏈。

  • 切入點(Pointcut):匹配連線點的謂詞。通知與切入點表示式關聯,並在任何由切入點匹配的連線點(例如,具有特定名稱的方法的執行)處執行。透過切入點表示式匹配連線點的概念是 AOP 的核心,Spring 預設使用 AspectJ 切入點表示式語言。

  • 引入(Introduction):代表型別宣告附加方法或欄位。Spring AOP 允許您向任何被通知的物件引入新的介面(以及相應的實現)。例如,您可以使用引入來使 bean 實現 IsModified 介面,以簡化快取。(引入在 AspectJ 社群中被稱為跨型別宣告(inter-type declaration)。)

  • 目標物件(Target object):被一個或多個切面通知的物件。也稱為“被通知物件(advised object)”。由於 Spring AOP 是透過執行時代理實現的,因此此物件始終是一個代理物件。

  • AOP 代理(AOP proxy):由 AOP 框架建立的物件,用於實現切面約定(通知方法執行等)。在 Spring Framework 中,AOP 代理是 JDK 動態代理或 CGLIB 代理。

  • 織入(Weaving):將切面與其他應用程式型別或物件連結起來以建立被通知物件。這可以在編譯時(例如,使用 AspectJ 編譯器)、載入時或執行時完成。Spring AOP,與其他純 Java AOP 框架一樣,在執行時執行織入。

Spring AOP 包括以下型別的通知

  • 前置通知(Before advice):在連線點之前執行的通知,但它沒有能力阻止執行流繼續到連線點(除非它丟擲異常)。

  • 返回後通知(After returning advice):在連線點正常完成(例如,如果方法返回而未丟擲異常)後執行的通知。

  • 丟擲後通知(After throwing advice):如果方法因丟擲異常而退出,則執行的通知。

  • 最終通知(After (finally) advice):無論連線點以何種方式退出(正常返回或異常返回),都將執行的通知。

  • 環繞通知(Around advice):環繞連線點(例如方法呼叫)的通知。這是最強大的通知型別。環繞通知可以在方法呼叫之前和之後執行自定義行為。它還負責選擇是繼續執行連線點,還是透過返回自己的返回值或丟擲異常來中止被通知方法的執行。

環繞通知是最通用的通知型別。由於 Spring AOP,像 AspectJ 一樣,提供了全系列的通知型別,我們建議您使用能夠實現所需行為的最不強大的通知型別。例如,如果您只需要使用方法的返回值更新快取,那麼最好實現返回後通知而不是環繞通知,儘管環繞通知可以實現相同的功能。使用最具體的通知型別可以提供更簡單的程式設計模型,並減少出錯的可能性。例如,您不需要在用於環繞通知的 JoinPoint 上呼叫 proceed() 方法,因此也就不會忘記呼叫它。

所有通知引數都是靜態型別的,因此您可以處理適當型別的通知引數(例如,方法執行的返回值的型別),而不是 Object 陣列。

由切入點匹配的連線點概念是 AOP 的關鍵,它將其與僅提供攔截的舊技術區分開來。切入點使通知能夠獨立於面向物件層次結構進行定位。例如,您可以將提供宣告式事務管理的環繞通知應用於跨多個物件的一組方法(例如服務層中的所有業務操作)。

© . This site is unofficial and not affiliated with VMware.