AOP是一種設計思想,在不修改源代碼的狀況下給程序動態統一添加額外功能的一種技術,如圖:spring
AOP底層基於代理機制(動態方式)實現功能擴展:
1):假如目標對象(被代理對象)實現接口,則底層能夠採用JDK動態代理機制爲目標對象建立代理對象(目標類和代理類會實現共同接口)。
2):假如目標對象(被代理對象)沒有實現接口,則底層能夠採用CGLIB代理機制爲目標對象建立代理對象(默認建立的代理類會繼承目標對象類型)。
如圖:spring-boot
spring.aop.proxy-target-class=falseui
切面(aspect):通常爲一個具體類(@Aspect註解註釋)切入點()spa
通知(Advice):在切面的某個特定點上執行的擴展設計
切入點(pointcut):使用@Pointcut註解進行切入點的描述,使用bean表達式定義切入點,語法:bean(spring容器中管理的某個bean的名字),bean表達式是一種粗粒度的切入點表達式(不能具體到bean中哪一個方法)需寫一個方法做爲承載切入點代理
鏈接點(joinpoint):封裝了切入點集合方法中的某個正在執行的目標方法code
<dependency> <groupId>org.springframework.boot</groupId>對象
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>blog
1.@Before。(目標方法執行以前執行)
2.@AfterReturning。(目標方法成功結束時執行)
3.@AfterThrowing。(目標方法異常結束時執行)
4.@After。(目標方法結束時執行)
5.@Around.(重點掌握,目標方法執行先後均可以作業務拓展)(優先級最高)繼承
說明:在切面類中使用什麼通知,由業務決定,並非說,在切面中要把全部通知都寫上。
**
bean表達式(重點)
bean表達式通常應用於類級別,實現粗粒度的切入點定義,案例分析:
說明:bean表達式內部的對象是由spring容器管理的一個bean對象,表達式內部的名字應該是spring容器中某個bean的name。
缺陷:不能精確到具體方法,也不能針對於具體模塊包中的方法作切入點設計
===========================================================
within表達式(瞭解)
within表達式應用於類級別,實現粗粒度的切入點表達式定義,案例分析:
within表達式應用場景分析:
1)對全部業務bean都要進行功能加強,可是bean名字又沒有規則。
2)按業務模塊(不一樣包下的業務)對bean對象進行業務功能加強。
===========================================================
execution表達式(瞭解)
execution表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析:
語法:execution(返回值類型 包名.類名.方法名(參數列表))。
===========================================================
@annotation表達式(重點)
@annotaion表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析
其中:RequiredLog爲咱們本身定義的註解,當咱們使用@RequiredLog註解修飾業務層方法時,系統底層會在執行此方法時進行日擴展操做。
切面的優先級須要藉助@Order註解進行描述,數字越小優先級越高,默認優先級比較低。列如:@Order(1),@Order(2)