原本我以爲這部分東西是沒什麼好說的,結果上週面試被問到了,東扯西扯半天,只說了個大概,這部分原本能夠說的更好的,因此寫個文章來總結下,說不定有機會還用得上面試
首先聲明一點,本文講的是Spring AOP中的術語,是AOP框架的定義,因此不要將AOP與動態代理混爲一談,AOP是一種思想,而動態代理是一種解決方案正則表達式
爲了下文能更形象地描述,這裏預設一個AOP的場景:老師上課前須要黑板是乾淨的,也就是說須要有人來幫忙擦黑板框架
這裏將術語分爲兩類,一類是對象術語,另外一類是行爲術語。對象術語指的是用於描述AOP中的各個對象部分,而行爲術語指的是在AOP實現過程當中涉及到的具體行爲代理
通知指的是AOP在正常流程以外額外要執行的動做,也就是經過AOP爲目標方法[1]新增的內容。根據前言中預設的場景,擦黑板這一行爲就被叫作通知code
確切地來講,通知描述了在正常流程以外額外要執行的具體工做,以及什麼時候執行這個工做。根據通知執行時間的不一樣,Spring AOP中能夠應用如下五種類型的通知對象
鏈接點指的是應用通知的時機,好比老師上課前這一時間點就是鏈接點。代碼能夠利用這些點插入本來的正常方法流程中,以添加新的行爲編譯器
可能有人會有疑問,不是剛剛說通知也表示了執行的時機,那鏈接點的定義不是重複了嗎?數學
通知描述了在正常流程以外額外要執行的具體工做,以及什麼時候執行這個工做it
我我的理解是這樣的,這兩個地方並不衝突。就比方說咱們告訴別人「我吃早飯」,可是他們只知道咱們吃的是早飯,重點是飯,而鏈接點則是將「早」這個概念抽象出來,好比「我在早上吃早飯」,重點就在「早」而不是「飯」。也就說是,通知的重點是內容,而鏈接點的則是將通知的應用時機細分出來io
對於咱們在方法正常流程以外執行的額外操做而言,通知定義了這些操做執行的內容和時機,切點則是定義了這些操做執行的位置
對於咱們預設的那個場景而言,不能只粗略說是在「老師」「上課」前擦黑板,而應該指明是什麼老師,上什麼課,好比咱們能夠說「全部一年級老師上政治課」前擦黑板,或是「全部姓劉的老師上數學課」前擦黑板
AOP會根據切點的定義,來匹配一個或多個鏈接點,而後應用咱們的通知。咱們一般會使用明確的類/方法名,或是正則表達式來指定切點。根據AOP框架的不一樣,切點匹配的自由度也會不一樣
切面是切點和通知的結合,定義了咱們的功能在什麼時候、何處、以及如何執行
切面定義了AOP的核心內容,在上述場景中,切面知道本身要作什麼(擦黑板),在哪作(A老師上B課的教室),以及什麼時候作(上課前)
引入指的向現有的類中添加新的方法或屬性。咱們能夠將新的方法或屬性引入到目標類中,這樣目標類就具備了新的方法,同時還不用修改現有具體類的定義
相比與引入,織入的概念更爲重要。織入指的是將切面應用到目標對象,在這個過程當中會生成新的代理對象
織入的執行的時機有如下幾個[2]:
AspectJ
的織入編譯器就採用的這種方式以上這些就是AOP中的經常使用術語,這些術語雖然你可能根本用不到,可是必定要知道,能明白代碼中的某個部分屬於AOP的哪一個部分,不然永遠都會是一個不斷寫簡單的業務代碼的碼農而已
最後總結一下對象術語,咱們完整的場景以下:
王老師在上語文課前,須要有人來擦黑板
在這個場景中,各自對象表明的內容以下: