AOP

AOP概述

1.什麼是AOP?

AOP是一種設計思想,在不修改源代碼的狀況下給程序動態統一添加額外功能的一種技術,如圖:
image.pngspring

2.AOP應用原理分析

AOP底層基於代理機制(動態方式)實現功能擴展:
1):假如目標對象(被代理對象)實現接口,則底層能夠採用JDK動態代理機制爲目標對象建立代理對象(目標類和代理類會實現共同接口)。
2):假如目標對象(被代理對象)沒有實現接口,則底層能夠採用CGLIB代理機制爲目標對象建立代理對象(默認建立的代理類會繼承目標對象類型)。
如圖:
image.pngspring-boot

AOP默認使用CGLIB代理,如需使用JDK代理配置文件配置:

spring.aop.proxy-target-class=falseui

基於JDK代理方式實現:

image.png

基於CGLIB代理方式實現:

image.png

AOP相關術語:

切面(aspect):通常爲一個具體類(@Aspect註解註釋)切入點()spa

通知(Advice):在切面的某個特定點上執行的擴展設計

切入點(pointcut):使用@Pointcut註解進行切入點的描述,使用bean表達式定義切入點,語法:bean(spring容器中管理的某個bean的名字),bean表達式是一種粗粒度的切入點表達式(不能具體到bean中哪一個方法)需寫一個方法做爲承載切入點代理

鏈接點(joinpoint):封裝了切入點集合方法中的某個正在執行的目標方法code

AOP添加的依賴:

<dependency> <groupId>org.springframework.boot</groupId>對象

<artifactId>spring-boot-starter-aop</artifactId>

</dependency>blog

註解說明:

  • @Aspect 註解用於標識或者描述AOP中的切面類型,基於切面類型構建的對象用於爲目標對象進行功能擴展或控制目標對象的執行。
  • @Pointcut註解用於描述切面中的方法,並定義切面中的切入點(基於特定表達式的方式進行描述),在本案例中切入點表達式用的是bean表達式,這個表達式以bean開頭,bean括號中的內容爲一個spring管理的某個bean對象的名字。
  • @Around註解用於描述切面中方法,這樣的方法會被認爲是一個環繞通知(核心業務方法執行以前和以後要執行的一個動做),@Aournd註解內部value屬性的值爲一個切入點表達式或者是切入點表達式的一個引用(這個引用爲一個@PointCut註解描述的方法的方法名)。
  • ProceedingJoinPoint類爲一個鏈接點類型,此類型的對象用於封裝要執行的目標方

通知類型(通知-Advice描述的是一種擴展業務):

1.@Before。(目標方法執行以前執行)
2.@AfterReturning。(目標方法成功結束時執行)
3.@AfterThrowing。(目標方法異常結束時執行)
4.@After。(目標方法結束時執行)
5.@Around.(重點掌握,目標方法執行先後均可以作業務拓展)(優先級最高)繼承

說明:在切面類中使用什麼通知,由業務決定,並非說,在切面中要把全部通知都寫上。

切入點表達式加強:

**

bean表達式(重點)

bean表達式通常應用於類級別,實現粗粒度的切入點定義,案例分析:

  • bean("userServiceImpl")指定一個userServiceImpl類中全部方法。
  • bean("*ServiceImpl")指定全部後綴爲ServiceImpl的類中全部方法。

說明:bean表達式內部的對象是由spring容器管理的一個bean對象,表達式內部的名字應該是spring容器中某個bean的name。

缺陷:不能精確到具體方法,也不能針對於具體模塊包中的方法作切入點設計

===========================================================

within表達式(瞭解)

within表達式應用於類級別,實現粗粒度的切入點表達式定義,案例分析:

  • within("aop.service.UserServiceImpl")指定當前包中這個類內部的全部方法。
  • within("aop.service.*") 指定當前目錄下的全部類的全部方法。
  • within("aop.service..*") 指定當前目錄以及子目錄中類的全部方法。

within表達式應用場景分析:

1)對全部業務bean都要進行功能加強,可是bean名字又沒有規則。

2)按業務模塊(不一樣包下的業務)對bean對象進行業務功能加強。

===========================================================

execution表達式(瞭解)

execution表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析:

語法:execution(返回值類型 包名.類名.方法名(參數列表))。

  • execution(void aop.service.UserServiceImpl.addUser())匹配addUser方法。
  • execution(void aop.service.PersonServiceImpl.addUser(String)) 方法參數必須爲String的addUser方法。
  • execution( aop.service...*(..)) 萬能配置。

===========================================================

@annotation表達式(重點)

@annotaion表達式應用於方法級別,實現細粒度的切入點表達式定義,案例分析

  • @annotation(anno.RequiredLog) 匹配有此註解描述的方法。
  • @annotation(anno.RequiredCache) 匹配有此註解描述的方法。

其中:RequiredLog爲咱們本身定義的註解,當咱們使用@RequiredLog註解修飾業務層方法時,系統底層會在執行此方法時進行日擴展操做。

切面優先級設置實現

切面的優先級須要藉助@Order註解進行描述,數字越小優先級越高,默認優先級比較低。列如:@Order(1),@Order(2)

相關文章
相關標籤/搜索