Spring Advisor增强规则实现原理介绍
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 实现了 增强逻辑的统一管理、动态匹配与链式组合,是整个框架的重要基础构件。