(筆記)Spring實戰_面向切面的Spring(1)_什麼是面向切面編程

在軟件開發中,分佈於應用中多處的功能被稱爲橫切關注的。通常,這些橫切關注的從概念上是與應用的業務邏輯相分離的(但是往往直接嵌入到應用的業務邏輯之中)。將這些橫切關注點與業務邏輯相分離正是面向切面編程(AOP)所要解決的。
在使用面向切面編程時,我們仍然在一個地方定義通用功能,但是我們可以通過聲明的方式定義這個功能以何種方式在何處應用,而無需修改受影響的類。橫切關注點可以被模塊化爲特殊的類,這些類被稱爲切面。
1.定義AOP術語
描述切面的常用術語有通知、切點和連接點。
通知
在AOP術語中,切面的工作被稱爲通知。
通知定義了切面是什麼以及何時使用。除了描述切面要完成的工作,通知還解決了何時執行這個工作的問題。
Spring切面可以應用5種類型的通知:
Before——在方法被調用之前調用通知
After——在方法完成之後調用通知,無論方法執行是否成功
After-returning——在方法成功執行之後調用通知
After-throwing——在方法拋出異常後調用通知
Around——通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行爲
連接點
我們的應用可能也需要對數以千計的時機應用通知。這些時機被稱爲連接點。連接點是在應用執行過程中能夠插入切面的一個點。這個點可以是調用方法時、拋出異常時、甚至修改一個字段時。切面代碼可以利用這些點插入到應用的正常流程之中,並添加新的行爲。
切點
切點的定義會匹配通知所要織入的一個或多個連接點。我們通常使用明確的類和方法名稱來指定這些切點,或是利用正則表達式定義匹配的類和方法名稱模式來指定這些切點。
切面
切面是通知和切點的結合。通知和切點共同定義了關於切面的全部內容——它是什麼,在何時和何處完成其功能。
引入
引入允許我們向現有的類添加新方法或屬性。
織入
織入是將切面應用到目標對象來創建新的代理對象的過程。切面在指定的連接點被織入到目標對象中。
編譯期——切面在目標類編譯時被織入。
類加載期——切面在目標類加載到JVM時織入。
運行期——切面在應用運行的某個時刻被織入。一般情況下,在織入切面時,AOP容器會爲目標對象動態地創建一個代理對象。Spring AOP就是以這種方式織入切面的。
2.Spring對AOP的支持
並不是所有的AOP框架都是一樣的,它們在連接點模型上可能有強弱之分。有些允許對字段修飾符級別應用通知,而另一些只支持與方法調用相關的連接點。它們織入切面的方式和時機也有所不同。但是無論如何,創建切點來定義切面織入的連接點是AOP框架的基本功能。
Spring提供了4種各具特色的AOP支持:
基於代理的經典AOP
@AspectJ註解驅動的切面
純POJO切面
注入式AspectJ切面(適合Spring各版本)
前3種都是Spring基於代理的AOP變體,因此,Spring對AOP的支持侷限於方法攔截。如果AOP需求超過了簡單方法攔截的範疇(比如構造器或者屬性攔截),那麼應該考慮在AspectJ裏面實現切面,利用Spring的DI把Spring Bean注入到AspectJ切面中。
Spring通知是Java編寫的
Spring所創建的通知都是用標準的Java類編寫的。而且,定義通知所應用的切點通常在Spring配置文件裏採用XML來編寫的。
Spring在運行期通知對象
通過在代理類中包裹切面,Spring在運行期將切面織入到Spring管理的Bean中。
代理類封裝了目標類,並攔截被通知的方法的調用,再將調用轉發給真正的目標Bean。
當攔截到方法調用時,在調用目標Bean方法之前,代理會執行切面邏輯。
直到應用需要被代理的Bean時,Spring才創建代理對象。
Spring只支持方法連接點
Spring缺少對字段連接點的支持,無法讓我們創建細粒度的通知,而且Spring也不支持構造器連接點,我們也無法在Bean創建時應用通知。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章