Spring Framework ‐ AOP(Aspect oriented programming) - CCH0124/spring-sandbox GitHub Wiki
AOP 是一種在透過將橫切關注點(cross-cutting concerns)分離來提高模組化的編程範式。它透過在不修改現有代碼的情況下向其添加額外的行為來實現這一點。
AOP 概念和術語
- Aspect
一個 Aspect 是對橫跨多個類的關注點(cross-cutting concerns)進行模組化封裝的一種方式。統一 Log 或是限流都可以是一個橫切關注點的例子。
- Joinpoint
在程式執行過程中,Joinpoint
是一個特定的切入點,例如方法的執行或異常的處理。在 Spring AOP 中,JoinPoint
始終代表方法的執行。
- Pointcut
Pointcut
是一個謂詞,用於將 Advice
與特定 JoinPoint
上的 Aspect
相關聯。通常將 Advice
與 Pointcut
表達式關聯起來,Advice
會在 Pointcut
匹配到的任何 JoinPoint
上運行。
execution(* com.example.service..*(..))
- Advice
Advice
是在特定 Joinpoint
上由 Aspect
採取的行動。不同類型的 Advice
包括 around
、before
和 after
等。在 Spring 中,Advice
被做為攔截器,維持一個環繞 Joinpoint
的攔截器鏈。
- Weaving
將切面(Aspect)和目標物件連結起來的過程,也就是將通知套用到切點(Pointcut)匹配的連接點。
AspectJ VS Spring AOP
Joinpoint | Spring AOP Supported | AspectJ Supported |
---|---|---|
Method Call | No | Yes |
Method Execution | Yes | Yes |
Constructor Call | No | Yes |
Constructor Execution | No | Yes |
Static initializer execution | No | Yes |
Object initialization | No | Yes |
Field reference | No | Yes |
Field assignment | No | Yes |
Handler execution | No | Yes |
Advice execution | No | Yes |
Advice 類型
- 前置通知(Before advice):
執行時機:在目標方法執行之前。
功能:提供在方法開始執行前做一些處理的機會,但不能阻止目標方法的執行。
- 返回後通知(After returning advice):
執行時機:在目標方法成功執行完成且沒有拋出異常後。
功能:可以在方法正常返回結果後執行特定的操作。
- 拋出異常後通知(After throwing advice):
執行時機:當目標方法因為異常而退出時執行。
功能:處理方法執行過程中的異常情況。
- 後置通知(After advice):
執行時機:不管目標方法是否正常返回,都會執行。
功能:可以用來進行一些清理或統一的後處理操作。
- 環繞通知(Around advice):
執行時機:在目標方法調用的前後進行執行。
功能:這是最靈活的通知類型,因為它可以完全控制方法的執行流程。你可以在目標方法執行前後加入自定義的行為,並且還可以選擇是否繼續執行目標方法,或者直接返回自定義的結果或拋出異常。