2:面向切面的基本原理
什麼是面向切面編程
橫切關注點:影響應用多處的功能(安全、事務、日誌)
切面:
橫切關注點被模塊化爲特殊的類,這些類稱爲切面
優點:
每個關注點現在都集中於一處,而不是分散到多處代碼中
服務模塊更簡潔,服務模塊只需關注核心代碼。
AOP 術語
§ 通知:
· 定義:切面也需要完成工作。在 AOP 術語中,切面的工作被稱爲通知。
· 工作內容:通知定義了切面是什麼以及何時使用。除了描述切面要完成的工作,通知還解決何時執行這個工作。
· Spring 切面可應用的 5 種通知類型:
- Before——在方法調用之前調用通知
- After——在方法完成之後調用通知,無論方法執行成功與否
- After-returning——在方法執行成功之後調用通知
- After-throwing——在方法拋出異常後進行通知
- Around——通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行爲
§ 連接點:
· 定義:連接點是一個應用執行過程中能夠插入一個切面的點。
· 連接點可以是調用方法時、拋出異常時、甚至修改字段時、
· 切面代碼可以利用這些點插入到應用的正規流程中
· 程序執行過程中能夠應用通知的所有點。
§ 切點:
· 定義:如果通知定義了“什麼”和“何時”。那麼切點就定義了“何處”。切點會匹配通知所要織入的一個或者多個連接點。
· 切點相當於使用 連接點 進行 條件過濾後 形成的結果。
· 通常使用明確的類或者方法來指定這些切點。
· 作用:定義通知被應用的位置(在哪些連接點)
§ 切面:
· 定義:切面是通知和切點的集合,通知和切點共同定義了切面的全部功能——它是什麼,在何時何處完成其功能。
§ 引入:
· 引入允許我們向現有的類中添加方法或屬性
§ 織入:
· 織入是將切面應用到目標對象來創建的代理對象過程。
· 切面在指定的連接點被織入到目標對象中,在目標對象的生命週期中有多個點可以織入
- 編譯期——切面在目標類編譯時期被織入,這種方式需要特殊編譯器。AspectJ的織入編譯器就是以這種方式織入切面。
- 類加載期——切面在類加載到
- JVM ,這種方式需要特殊的類加載器,他可以在目標類被引入應用之前增強該目標類的字節碼。AspectJ5的 LTW 就支持這種織入方式
- 運行期——切面在應用運行期間的某個時刻被織入。一般情況下,在織入切面時候,AOP 容器會爲目標對象動態的創建代理對象。Spring AOP 就是以這種方式織入切面。