一、什麼是面向切面編程?
如圖所示,有三個Service,他們中的許多方法都涉及到安全規則、事務規則等類似的規則,面對類似
甚至類似的代碼,我們第一反應肯定是要抽取,以便重用。
Aop, aspect object programming 面向切面編程
功能: 讓關注點代碼(就是指重複執行的代碼)與業務代碼分離!
AOP實際就是面向重複代碼編程,對很多功能都有的重複代碼抽取,在運行的時候往業務方法上動態織入到“切面類代碼”
AOP名詞
1.關注點
我們要抽取的重複代碼就叫做關注點
2.切面(Aspect)
關注點(重複代碼)所形成的類,就叫做切面。
切面是通知和切點的結合,通知和切點共同定義了切面的全部內容——他是什麼,在何時和何處完成其功能
3.通知(Advice)
切面(重複代碼類)的工作被稱爲通知
Spring切面可以應用5種類型的通知:
- 前置通知(Before):在目標方法之前調用通知功能
- 後置通知(After):在目標方法之後調用的通知,此時不會關心方法的輸出是什麼
- 返回通知(After-Retruning):在目標方法成功執行後調用通知
- 異常通知(After-throwing):在目標方法拋出異常時調用通知
- 環繞通知(Around):通知包裹了被通知的方法,在被通知的方法調用之前和調用之後執行自定義的行爲
4.連接點(Join point)
目標對象中,所有可以增強的方法,我們的應用可能有數以千計的實際應用通知,這些時機被稱爲連接點。(一個班裏有30個人,你可以打電話給這30個同學,那麼連接點就是30個)。
切點代碼可以利用這些鏈接點插入到應用的正常流程中,並添加新的行爲。
5.切點(Poincut)
在目標對象中,實際增強的方法。(班裏30個同學中,你只聯繫了2個,那麼這兩個就是你的切點)
如果說通知定義了切面的“什麼”和“何時”的話,那麼切點就定義了何處。
我們通常使用明確的類和方法名稱,或是利用正則表達式定義所匹配的類和方法名稱來指定這期切面。
6.織入(Weaving):將通知織入切入點的過程,一般在對象的生命週期裏有多個點可以織入
- 編譯期
- 類加載期
- 運行期