Spring Advisor增強規則實現原理介紹
- 一、什么是 Advisor?
- 1. Advisor 的定義與本質
- 接口定義:
- 2. Advisor 的核心作用
- 統一封裝切點與通知
- 構建攔截器鏈的基礎
- 實現增強邏輯的靈活組合
- 二. Sprin當中的實現邏輯
- 1 `Advisor` 接口定義
- 2 `PointcutAdvisor` 接口定義
- 3 `AspectJExpressionPointcutAdvisor` 實現類
源碼見:mini-spring
一、什么是 Advisor?
參考:AOP相關核心概念與作用說明(補充)
1. Advisor 的定義與本質
Advisor
(顧問)是 Spring AOP 提供的一個接口,用于封裝以下兩部分內容:
-
Advice:增強邏輯,即實際執行的橫切代碼。
-
Pointcut:切點邏輯,定義增強邏輯在哪些連接點(方法)生效。
通俗來說,Advisor = Advice + Pointcut
這種設計讓 Spring AOP 框架可以通過統一的方式處理各種通知類型(如前置、后置、環繞等)。
接口定義:
public interface Advisor {Advice getAdvice();
}
當一個 Advisor 同時包含切點信息時,會實現其子接口 PointcutAdvisor
:
public interface PointcutAdvisor extends Advisor {Pointcut getPointcut(); // 獲取切點定義
}
2. Advisor 的核心作用
統一封裝切點與通知
在 Spring AOP 中,大量組件實現了 Advisor
接口。通過這一統一抽象,框架無需區分通知類型(如 BeforeAdvice
/ AfterAdvice
),可以統一處理邏輯。
構建攔截器鏈的基礎
Spring AOP 在執行代理方法時會構建一個攔截器鏈(interceptor chain),每個 Advisor
都會被包裝為 MethodInterceptor
插入到鏈中。只有切點匹配的 Advisor
才會生效。
實現增強邏輯的靈活組合
多個 Advisor
可以作用于同一個目標類,實現增強邏輯的靈活組合和動態添加,具有良好的擴展性和可插拔性。
簡而言之,
Advisor
就是 Spring AOP 中的“顧問”,它告訴框架:
在哪些地方執行什么增強邏輯
二. Sprin當中的實現邏輯
1 Advisor
接口定義
/*** 顧問接口:封裝一個 Advice(通知邏輯)* 不關注切點,適用于全局增強邏輯* * @author jixu* @date 2025/5/27*/
public interface Advisor {/*** 獲取通知邏輯對象*/Advice getAdvice();
}
2 PointcutAdvisor
接口定義
/*** 切點顧問接口:封裝 Advice + Pointcut* 常用于需要指定增強位置的通知(如方法級別攔截)* * @author jixu* @date 2025/5/27*/
public interface PointcutAdvisor extends Advisor {/*** 獲取切點定義*/PointCut getPointcut();
}
3 AspectJExpressionPointcutAdvisor
實現類
/*** 基于 AspectJ 表達式的切點顧問實現* 封裝了一個切點表達式(Pointcut)和對應的通知(Advice)* * 用于將 Pointcut + Advice 組合成統一 Advisor 結構* * @author jixu* @date 2025/5/27*/
public class AspectJExpressionPointcutAdvisor implements PointcutAdvisor {private Advice advice; // 通知邏輯private PointCut pointcut; // 切點對象private String expression; // 切點表達式public AspectJExpressionPointcutAdvisor() {}@Overridepublic PointCut getPointcut() {if (this.pointcut == null) {this.pointcut = new AspectJExpressionPointcut(expression);}return this.pointcut;}@Overridepublic Advice getAdvice() {return this.advice;}public void setAdvice(Advice advice) {this.advice = advice;}public void setExpression(String expression) {this.expression = expression;}
}
組件 | 作用 |
---|---|
Advice | 具體的增強邏輯,如日志打印、事務控制 |
Pointcut | 定義哪些連接點需要增強 |
Advisor | 封裝 Advice 和 Pointcut,統一 AOP 調度入口 |
PointcutAdvisor | 可匹配特定方法的 Advisor |
AspectJExpressionPointcutAdvisor | 結合 AspectJ 表達式生成動態切點 |
通過將 Advice 與 Pointcut 封裝為 Advisor,Spring AOP 實現了 增強邏輯的統一管理、動態匹配與鏈式組合,是整個框架的重要基礎構件。