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):
執行時機:在目標方法調用的前後進行執行。
功能:這是最靈活的通知類型,因為它可以完全控制方法的執行流程。你可以在目標方法執行前後加入自定義的行為,並且還可以選擇是否繼續執行目標方法,或者直接返回自定義的結果或拋出異常。