AOP
面向切面編程,也可稱為面向方面編程,是一種編程規范,提供從另一個角度來考慮程序結構從而完善面向對象編程(oop)
在進行oop開發時,都是基於對組件進行開發,然后對組件進行組合,oop最大問題就是無法解耦組件進行開發
AOP為開發者提供一種進行橫切關注點,分離並織入的機制,把關橫切關注點分離,然后織入到系統中,從而無耦合的完成了我們的功能
AOP能干什么:
- 用於橫切關注點的分離和織入橫切關注點到系統
- 完善oop
- 降低組件和模塊之間的耦合性
- 使系統容易擴展
- 而且由於關注點分離從而可以獲得組件的更好復用
關注點和織入
關注點可以分為核心關注點和橫切關注點,核心關注點即一些主要業務流程,比如支付,橫切關注點相當於一些服務,比如日志輸出。
-
關注點
可以認為是任何東西,比如日志組件
-
關注點分離
將問題細化從而單獨部分,既可以理解為不可再分割的組件。
-
橫切關注點
一個組件無法完成需要的功能,需要其他組件協助完成,如日志組件,橫切於支付組件。
橫切關注點可能包含很多,比如非業務的:日志,事務處理,緩存,性能統計,權限控制等等這些非業務的基礎功能,還可能是業務,如某個業務組件橫切於多個模塊
-
織入
橫切關注點分離后,需要通過某種技術將橫切關注點融合到系統中從而完成需要的功能,因此需要織入,織入可能在編譯期,加載期,運行期等進行。
AOP的基礎概念
-
連接點(Joinpoint)
表示需要在程序中插入橫切關注點的擴展點,Spring只支持方法執行連接點,在AOP中表示“在哪里干”。
-
切入點(Pointcut)
選擇一組相關連接點的模式,即可以認為連接點的集合,Spring支持perl5正則表達式和Aspect切入點模式,Spring默認使用Aspect語法,在AOP中表示“在哪里干的集合”
-
通知(Advice)
在連接點上執行的行為,通知提供了在AOP中需要在切入點所選擇的連接點處進行擴展現有行為的手段,包括前置通知(before advice),后置通知(after advice),環繞通知(around advice),在AOP中表示為“干什么”
-
方面/切面(Aspect)
橫切關注點的模塊化,在AOP中表示為“在哪干和干什么集合”
切面=切入點+通知
-
目標對象(Target Object)
需要被織入橫切關注點的對象,在AOP中表示為“對誰干”
-
織入(Weaving)
織入是一個過程,是將切面應用到目標對象從而創建出AOP代理對象的過程,織入可以在編譯期,類裝載期,運行期進行。
-
AOP代理(AOP Proxy)
AOP框架使用代理模式創建的對象,從而實現在連接點處插入通知(即應用切面),就是通過代理來對目標對象應用切面。在Spring中,AOP代理可以用JDK動態代理或CGLIB代理實現,而通過攔截器模型應用到切面。
-
-
Advice分類
前置通知(Before Advice):在切入點選擇的連接點處的方法之前執行的通知
后置通知(After Advice): 在切入點選擇的連接點處的方法之后執行的通知
環繞通知(Around Advices):環繞着在切入點選擇的連接點處的方法所執行的通知 -
execution表達式
execution表達式是切入點(PointCut)中使用的一種模式,比如
execution(* com.sample.service.impl..*.*(..))
第一個號:表示返回類型,號表示所有的類型。
包名:表示需要攔截的包名,后面的兩個句點表示當前包和當前包的所有子包,com.sample.service.impl包、子孫包下所有類的方法。
第二個號:表示類名,號表示所有的類。
(..):最后這個星號表示方法名,號表示所有的方法,后面括弧里面表示方法的參數,兩個句點表示任何參數。示例:
定義業務類
定義切面
配置
測試
@Aspect
Spring除了支持Schema方式配置AOP,還支持注解方式:使用@AspectJ風格的切面聲明
啟用對@Aspect的支持聲明切面,@Aspect聲明切入點org.aspectj.lang.annotation包下的,@Pointcut(value=“execution表達式”)。
聲明通知
org.aspectj.lang.annotation 包下的
@Before(value = "切入點表達式或命名切入點")
@After(value = "切入點表達式或命名切入點")
@Around(value = "切入點表達式或命名切入點")
示例:
定義業務類
定義切面
配置
測試