Spring AOP的術語彙總

前言

原本我以爲這部分東西是沒什麼好說的,結果上週面試被問到了,東扯西扯半天,只說了個大概,這部分原本能夠說的更好的,因此寫個文章來總結下,說不定有機會還用得上面試

首先聲明一點,本文講的是Spring AOP中的術語,是AOP框架的定義,因此不要將AOP與動態代理混爲一談,AOP是一種思想,而動態代理是一種解決方案正則表達式

爲了下文能更形象地描述,這裏預設一個AOP的場景:老師上課前須要黑板是乾淨的,也就是說須要有人來幫忙擦黑板框架

術語

這裏將術語分爲兩類,一類是對象術語,另外一類是行爲術語。對象術語指的是用於描述AOP中的各個對象部分,而行爲術語指的是在AOP實現過程當中涉及到的具體行爲代理

對象術語

通知(Advice)

通知指的是AOP在正常流程以外額外要執行的動做,也就是經過AOP爲目標方法[1]新增的內容。根據前言中預設的場景,擦黑板這一行爲就被叫作通知code

確切地來講,通知描述了在正常流程以外額外要執行的具體工做,以及什麼時候執行這個工做。根據通知執行時間的不一樣,Spring AOP中能夠應用如下五種類型的通知對象

  • 前置通知(Before):在目標方法被調用前執行的行爲
  • 後置通知(After):在目標方法執行完成後執行的行爲,不能獲取到方法的輸出
  • 返回通知(After-returning):在目標方法成功執行後執行的行爲,能夠獲取到方法的輸出
  • 異常通知(After-throwing):在目標方法拋出異常後執行的行爲
  • 環繞通知(Around):包裹了目標方法,能夠在其執行先後執行自定義的行爲

鏈接點(Join point)

鏈接點指的是應用通知的時機,好比老師上課前這一時間點就是鏈接點。代碼能夠利用這些點插入本來的正常方法流程中,以添加新的行爲編譯器

可能有人會有疑問,不是剛剛說通知也表示了執行的時機,那鏈接點的定義不是重複了嗎?數學

通知描述了在正常流程以外額外要執行的具體工做,以及什麼時候執行這個工做it

我我的理解是這樣的,這兩個地方並不衝突。就比方說咱們告訴別人「我吃早飯」,可是他們只知道咱們吃的是早飯,重點是飯,而鏈接點則是將「早」這個概念抽象出來,好比「我在早上吃早飯」,重點就在「早」而不是「飯」。也就說是,通知的重點是內容,而鏈接點的則是將通知的應用時機細分出來io

切點(Pointcut)

對於咱們在方法正常流程以外執行的額外操做而言,通知定義了這些操做執行的內容時機切點則是定義了這些操做執行的位置

對於咱們預設的那個場景而言,不能只粗略說是在「老師」「上課」前擦黑板,而應該指明是什麼老師,上什麼課,好比咱們能夠說「全部一年級老師上政治課」前擦黑板,或是「全部姓劉的老師上數學課」前擦黑板

AOP會根據切點的定義,來匹配一個或多個鏈接點,而後應用咱們的通知。咱們一般會使用明確的類/方法名,或是正則表達式來指定切點。根據AOP框架的不一樣,切點匹配的自由度也會不一樣

切面(Aspect)

切面是切點通知的結合,定義了咱們的功能在什麼時候、何處、以及如何執行

切面定義了AOP的核心內容,在上述場景中,切面知道本身要作什麼(擦黑板),在哪作(A老師上B課的教室),以及什麼時候作(上課前)

行爲術語

引入(Introduction)

引入指的向現有的類中添加新的方法或屬性。咱們能夠將新的方法或屬性引入到目標類中,這樣目標類就具備了新的方法,同時還不用修改現有具體類的定義

織入(Weaving)

相比與引入,織入的概念更爲重要。織入指的是將切面應用到目標對象,在這個過程當中會生成新的代理對象

織入的執行的時機有如下幾個[2]

  • 編譯期:在目標類被編譯時進行織入,須要依賴於特殊的編譯器。AspectJ的織入編譯器就採用的這種方式
  • 類加載期:在目標類被加載到JVM時進行織入,須要依賴於特殊的類加載器。這種方式會在目標類被引入應用前加強目標類的字節碼
  • 運行期:在應用運行的某一具體時刻進行織入。在這種狀況下,AOP容器會爲目標對象動態地建立一個代理對象,Spring AOP就採用的這種方式

總結

以上這些就是AOP中的經常使用術語,這些術語雖然你可能根本用不到,可是必定要知道,能明白代碼中的某個部分屬於AOP的哪一個部分,不然永遠都會是一個不斷寫簡單的業務代碼的碼農而已

最後總結一下對象術語,咱們完整的場景以下:

王老師在上語文課前,須要有人來擦黑板

在這個場景中,各自對象表明的內容以下:

  • 被加強的方法:王老師的語文課
  • 目標方法所在類:王老師
  • 通知(前置通知):作某事前擦黑板,重點是擦黑板這一行爲
  • 鏈接點:老師上課前的時間,並不肯定是哪些老師上哪門課前
  • 切點:王老師上語文課前這一時間點
  • 切面:在王老師上語文課前擦黑板

  1. 目標方法指的是AOP所切入的方法,在上述場景中,老師上課這一行爲就是目標方法 ↩︎

  2. 參考《Spring in Action》 ↩︎

相關文章
相關標籤/搜索