AOP
:(Aspect Oriented Programming
)面向切面編程。面向切面編程是一種編程範式,它做爲OOP面向對象編程的一種補充,用於處理系統中分佈於各個模塊的橫切關注點,好比事務管理、權限控制、緩存控制、日誌打印等等。express
AOP
它是一種設計模式,用於實現一個系統中的某一個方面的應用。編程
1.Join point(鏈接點)
Spring 官方文檔的描述:設計模式
A point during the execution of a program, such as the execution of a method or the handling of an exception. In Spring AOP, a join point always represents a method execution.
程序執行過程當中的一個點,如方法的執行或異常的處理。在Spring AOP
中,鏈接點老是表示方法的執行。通俗的講,鏈接點即表示類裏面能夠被加強的方法 緩存
2.Pointcut(切入點)
Spring 官方文檔的描述:框架
Pointcut are expressions that is matched with join points to determine whether advice needs to be executed or not. Pointcut uses different kinds of expressions that are matched with the join points and Spring framework uses the AspectJ pointcut expression language
切入點是與鏈接點匹配的表達式,用於肯定是否須要執行通知。切入點使用與鏈接點匹配的不一樣類型的表達式,Spring框架使用AspectJ切入點表達式語言。咱們能夠將切入點理解爲須要被攔截的Join point spa
3.Advice(加強/通知)
所謂通知是指攔截到Joinpoint
(鏈接點)以後所要作的事情就是通知,通知分爲前置通知、後置通知、異常通知、最終通知和環繞通知(切面要完成的功能) 翻譯
4.Aspect(切面) Aspect
切面表示Pointcut
(切入點)和Advice
(加強/通知)的結合設計
Advice註解一共有五種,分別是:
1.@Before前置通知
前置通知在切入點運行前執行,不會影響切入點的邏輯
2.@After後置通知
後置通知在切入點正常運行結束後執行,若是切入點拋出異常,則在拋出異常前執行
3.@AfterThrowing異常通知
異常通知在切入點拋出異常前執行,若是切入點正常運行(未拋出異常),則不執行
4.@AfterReturning返回通知
返回通知在切入點正常運行結束後執行,若是切入點拋出異常,則不執行
5.@Around環繞通知
環繞通知是功能最強大的通知,能夠在切入點執行先後自定義一些操做。環繞通知須要負責決定是繼續處理join point
(調用ProceedingJoinPoint
的proceed
方法)仍是中斷執行日誌
那麼問題來了,什麼是「面」?以及什麼「面向切面編程」? code
AOP
被翻譯成「面向切面編程」,因此這裏我更傾向於將「面」理解爲「切面」(Aspect
)。
從字面上理解,「切面」來自幾何學,在立體幾何中,切面是指用一個平面去截一個幾何體(包括圓柱,圓錐,球,棱柱,棱錐、長方體,正方體等等),獲得的平面圖形。
那什麼是「面向切面編程」?就是在該切面上加入一些邏輯操做(能夠簡單理解爲「對切面的操做」)。
舉個例子:
好比 「鬥地主」:
第一把不知道誰是地主,因而咱們將一張牌,反過來查入到撲克牌當中。原本應該按照順序摸牌,並不能知道誰是地主,可是由於你在某個位置插入了一個特殊操做(將一張牌反插入),由於多了一個邏輯(誰摸到這張反插的排,誰就是地主),因此能夠知道誰是地主。
對「面向切面的編程」的最基礎理解就是這樣。