本文章為讀書筆記,文獻參考《Spring in Action 第二版 中文版》。
當然文章一上來也是一些無聊的解釋,對於AOP術語的解釋,大都不是很直觀,所以我這裡先將書中的解釋抄錄下來,然後再加上我自己理解的解釋,然後再附片,在圖片上標註一些解釋資訊,這樣,盡量將這些術語解釋的清晰一些,以便後邊的講解更明白。
通知(Advice):切面的功能被稱為“通知”,通知定義了切面是什麼,何時使用。如它應該引用在某個方法被調用之前、之後、之前和之後、或是只在方法拋出一個異常時?
連接點(Joinpoint):連接點是在程式執行過程中能夠插入切面的一個點。這個點可以是方法被調用時、異常拋出時、甚至欄位被編輯時。切面的代碼可以通過這些點插入到程式的一般流程之中,從而添加新的行為。
切入點(Pointcut):一個切面不是一定要通知程式裡全部連接點。切入點可以縮小切面通知的連接點的範圍。切入點定義了切面的“何地”使用。切入點的定義匹配要織入的一個或多個連接點。我們通常使用明確的類和方法名稱,或是,利用Regex定義匹配的類和方法名稱模板來指定這些切入點。有些AOP架構允許建立動態切入點,可以根據運行時的狀態(比如方法的參數值)來應用切面。
切面(Aspect):切面是通知和切入點的結合。通知和切入點共同定義了關於切面的全部內容--他的功能,在何時和何地完成這個功能。
引入(Introduction):“引入”允許我們向現有的類添加新的方法和屬性。(這個定義我還是不太明白)
目標(Target):“目標”是被通知的對象。它可以是我們編寫的任何一個對象或是第三方對象。如果不使用AOP,那麼這個對象就只能自己處理主要的商務邏輯(儲存資料)和交叉事務的邏輯(日誌記錄)。使用了AOP,那麼這兩個商務邏輯就可以分開了。目標對象只負責出路主要的商務邏輯(儲存資料)。交叉事務的邏輯(日誌記錄)交給“通知”來處理。
代理(Proxy):“代理”是向“目標對象”應用“通知”之後被建立的對象。對於我們來說目標對象(在應用AOP之前的對象)和代理對象(在應用AOP之後的對象)是一樣的。
織入(Weaving):“織入”是把切面應用到目標對象來建立新的代理對象的過程。切面在指定的連接點(切入點)織入到目標對象。在目標對象的生命週期中有至少三個時機可以發生織入過程:編譯時間、類載入時、運行時。
Spring對AOP的支援是基於代理的且局限於方法注入,這是SpringAOP織入切面的方式。它是在運行時被織入,在織入切面時,Spring AOP會建立一個代理對象來委託給目標對象(Proxy設計模式)。AspectJ是基於編譯時間的,AspectJ 5是基於類載入時的。
下面是我對這幾個術語的解釋,我會舉一個簡單的例子。
交叉事務:若是儲存資料,記錄日誌兩個操作都在同一個方法中完成或是在同一個類中完成,那麼可以說這就是記錄日誌就是交叉事務。1、先將資料記錄到log中,2,、儲存資料,3、儲存成功之後記錄儲存結果,4、發生異常了還要記錄異常資訊。如下如所示:
通知(Advice):像這種交叉事務在程式中有成百上千的地方會用到,就如 圖1 所示的那樣。而這些交叉事務的代碼又很相同,因此我們可以將這些交叉事務抽出來,讓我們的主業務去處理主要的事務,不讓交叉事務影響我的視線。這樣我們既達到了代碼重用的效果,也不影響程式的正常開發。抽象出來的這部分事務就可以籠統的叫做“通知(Advice)”。如所示,LogTest類就是一個通知類。
上邊的“通知(Advice)”術語中說,1、通知定義了切面是什麼。就上邊的LogTest來說,我們的通知定義了切面是記錄日誌的東西。2、何時使用。還是LogTest來看,三個方法分別定義了saveObject之前,saveObject之後,saveObject發生異常時,當然這三個時刻那個都可以,或是其中的一兩個也可以。想想通知其實就是抽出來的交叉事務類。
連接點(Joinpoint):簡單的說主商務邏輯中的每個業務方法加起來一起被稱為連接點(Joinpoint)。如的Test類中的saveObject方法,若是有updateObject,deleteObject,getObject方法的,這些方法統一就做連接點。仔細想想就是主業務中的方法。我們可以在這些連接點上加入我們的通知代碼。如2所示,所有的
菱形 統一叫做連接點,這些連接點就是主程式執行中的那些方法。至於如何加入,後邊介紹。
切入點(Pointcut):我們將通知加入到主Business Connectivity點(方法)中,但不可能在主業務的所有連接點(方法)中加入通知,我們會選擇其中一個或幾個連接點加入通知。這樣我們就縮小了連接點的範圍。這其中的一個或幾個連接點(方法)就被稱作“切入點(Pointcut)”。如2所示,中間的箭頭表示的就是切入點,它會選擇其中的一個或幾個方法加入。如Test方法中的saveObject方法就是一個切入點,我們可以在儲存資料的前、後、異常時進行日誌記錄。這樣的話切面的”何地“的解釋就出來了。
切面(Aspect):如上邊的術語所說,將通知和切入點組合起來就是切面(Aspect)。用我自己的話來簡單的概括一句就是:在程式運行時將LogTest類的功能加入到Test類的saveObject方法上去。
目標(Target):即是目標對象。就是將通知(LogTest)加入到的指定的業務對象(Test)。如所示Test對象就是目標對象,如果不是用AOP,那麼記錄日誌的和儲存資料的工作就都有這個Test一力承擔了。使用AOP將交叉業務分離出去,承載主業務的對象就是目標對象(Target)。
代理(Proxy):即代理對象。上邊文字也說了Spring對AOP的支援是基於代理的,就是說,我們將通知加入到目標對象之後,Spring
AOP會建立一個目標對象的代理對象。這個代理對象會包裹著目標對象,當我們將通知中的方法應用到目標對象中的方法時,其實是將通知中方法交給我了代理對象,然後代理對象在轉交給目標對象。3所示。
織入(Weaving):我的理解是將通知通過切點加入到目標對象然後建立一個目標對象的代理的過程。
對於以上的解釋,還有很多欠缺的地方,我會對Spring AOP由淺入深理解的同時做出修改。