Spring學習筆記 面向切面程式設計(AOP)

2021-08-17 07:10:51 字數 2444 閱讀 5850

在軟體開發中,散布於應用中多處的功能被稱為橫切關注點(cross-cutting concern)。通常來講,這些橫切關注點從概念上來講應該與應用的業務邏輯相分離(但是往往會直接嵌入到應用的業務邏輯中)。把橫切關注點與邏輯相分離正是面向切面程式設計(aop)所要解決的問題。

切面實現了橫切關注點(跨多個應用物件的邏輯)的模組化

切面可以模組化橫切關注點。簡言之,橫切關注點可以被描述為影響應用多處的功能,例如,安全、日誌、事務等,圖中安全為乙個橫切關注點,應用中的很多方法都會涉及到安全規則。圖中展示了乙個被劃分為模組的典型引用。每個模組的核心功能都是為特定的業務領域提供服務,但是這些模組都需要類似的輔助功能,例如安全,日誌等。如果要重用通用功能的話,最常見的物件導向技術是繼承(inheritance)或是委託(delegation)。但是,如果在整個應用系統中都使用相同的基類,繼承往往會導致乙個脆弱的物件體系;而使用委託可能需要對委託物件進行複雜的呼叫。

切面提供了一種取代繼承和委託的另一種解決方案,而且在許多場景下更清晰簡潔。在使用切面程式設計時,我們仍然在乙個地方定義通用的功能,但是可以通過宣告的方式定義這個功能要以何種方式在何處應用,而無需修改受影響的類。橫切關注點可以被模組化為特殊的類,這些類被稱為切面(aspect)。這樣有兩個好處:首先,現在每個關注點都集中於乙個地方,而不是分散到多處**中;其次,服務模組更簡潔,因為他們只包含主要關注點(核心功能的**),而次要關注點的**被轉移到切面中了。

在乙個或多個連線點上,可以把切面的功能(通知)置入

到程式的執行過程中

舉個例子,當抄表員出現在我們家門口的時候,要登記用電量並回去報告給電力公司。顯然,他們必須擁有一根需要抄表的使用者清單,他們所匯報的的資訊也很重要,但是記錄用電量才是抄表員的主要工作。類似地,切面也有目標——它必須要完成的工作。在aop術語中,切面的工作被稱為通知

通知定義了切面是什麼以及何時使用。除了描述切面要完成的工作,通知還解決了何時執行這個工作的問題。他應該應用在某個方法被呼叫之前?之後?亦或是前後都呼叫?還是只在丟擲異常的時候呼叫?

spring切面可以應用的5中型別的通知:

前置通知(before):在目標方法被呼叫之前呼叫通知功能;

後置通知(after):在目標方法完成之後呼叫通知,此時不關心方法的輸出是什麼;

返回通知(after-retruning):在目標方法成功執行之後呼叫通知;

異常通知(after-throwing):在目標方法丟擲異常後呼叫通知;

環繞通知(around):通知包裹了被通知的方法,在被通知的方法呼叫之前和呼叫之後執行自定義的行為。

電力公司為多個住戶提供服務,甚至可能是整個成事。每家中都有乙個電表,這些電表上的數字是需要讀取的,因此每家都是抄表員的潛在目標。抄表員也許能夠讀取各種型別的裝置,但是為了完成他的工作,他的目標應該是房屋內所安裝的電表。

同樣,我們的應用可能有數以千計的時機應用通知。這些時機被稱為連線點。連線點是在應用執行過程中能夠插入切面的乙個點。這個點可以是呼叫方法時、丟擲異常時、甚至是修改乙個欄位時。切面**可以利用這些點插入到應用的正常流程之中,並新增新的行為。

如果讓乙個抄表員訪問所有電力公司服務的所有使用者,那肯定是不現實的。實際上,電力公司為每乙個抄表員都分別指定了乙個區域的住戶。類似的,乙個切面並不需要通知應用的所有連線點。切點有助於縮小切面所通知的連線點的範圍。

如果說通知定義了切面的「什麼」和「何時」的話,那麼切點就定義了「何處」。切點的定義會匹配通知所要織入的乙個或多個連線點。我們通常使用明確的類和方法名稱,或是利用正規表示式定義所匹配的類和方法名稱來指定切點。有些aop框架允許我們建立動態的切點,可以根據執行時的策略(比如方法的引數值)來決定是否應用通知。

當抄表員開始第一天的工作時,他知道自己要做的事情(報告用電量)和從哪個房屋收集資訊。因此,她知道要完成工作所需要的一切東西。

切面是通知和切點的結合。通知和切點共同定義了切面的全部內容——它是什麼,在何時和何處完成其功能

引入允許我們向現有的類新增新方法或屬性。例如我們可以建立乙個auditable通知類,該類記錄了物件最後一次修改時的狀態。這個很簡單,只需乙個方法,setlastmodified(date),和乙個例項變數來儲存這個狀態。然後,這個新方法和例項變數就可以被引入到現有的類當中,從而可以在無需修改這些現有的類的情況下,讓他們具有新的行為和狀態。

織入是把切面應用到目標物件並建立新的**物件的過程。切面在指定的連線點被織入到目標物件中。在目標物件的生命週期裡有多個點可以進行織入:

通知包含了需要用於多個應用物件的橫切行為;連線點是程式執行過程中能夠應用通知的所有點;切點定義了通知被應用的具體位置(在哪些連線點)。其中關鍵的概念是切點定義了哪些連線點會接到通知。

Spring面向切面程式設計

1 面向切面程式設計 aop 的概念 把專案中需要在多處用到的功能,比如日誌 安全和事物等集中到乙個類中處理,而不用在每個需要用到該功能的地方顯式呼叫。2 術語解釋 橫切關注點 分布應用於多處的功能 切面 橫切關注點可以被模組化為乙個類,這個類被稱為乙個切面 通知 advice 切面要完成的工作。s...

Spring實戰筆記 面向切面程式設計(一)

面向切面程式設計的基本原理 通過pojo建立切面 使用 aspectj註解 為aspectj切面注入依賴 引言 在軟體開發中,散布於應用中多處的功能被稱為橫切關注點 cross cutting concern 橫切關注點應該是與業務邏輯相分離的,實現這種分離就是面向切面程式設計 aop 要解決的問題...

Spring的面向切面AOP

aop 面向切面 通知 advice 在什麼時機呼叫該方法 spring提供了5種通知 切點 pointcut 標註需要使用到該通知的方法的位置 切面 aspect 是通知與切點的結合 spring提供了4種各具特色的aop支援 基於 的經典aop aspectj註解驅動的切面 純pojo切面 注入...