《極限競速地平線5》GTR LB Works套件漂移調校
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 = "切入點表示式或命名切入點")
示例:
定義業務類
定義切面
配置
測試