1. 项目概述
在Spring框架的学习过程中,AOP(面向切面编程)是一个绕不开的核心概念。今天我们要探讨的是AOP中一个非常关键的设计模式——PointcutAdvisor,它巧妙地将Pointcut(切点)和Advice(通知)组合在一起,形成了Spring AOP的基石。
我最初接触这个概念时,常常困惑于为什么需要把Pointcut和Advice分开定义,又通过Advisor组合起来。直到在实际项目中尝试实现一个简化版的Spring框架(我们称之为mini-spring),才真正理解了这种设计背后的精妙之处。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. AOP核心概念解析
2.1 Pointcut:精准定位切入点
Pointcut定义了在哪些连接点(Join Point)上应用通知。在Spring中,连接点可以是方法的执行、异常的抛出等。Pointcut通过类过滤和方法匹配两个维度来精确定位切入点。
java复制public interface Pointcut {
ClassFilter getClassFilter();
MethodMatcher getMethodMatcher();
}
实际开发中,我们最常用的是基于表达式的切点,比如@Pointcut("execution(* com.example.service.*.*(..))")。但在mini-spring的实现中,为了简化,我们通常会先实现一个基本的NameMatchMethodPointcut,通过方法名进行匹配。
2.2 Advice:定义增强行为
Advice定义了在连接点执行的具体操作。Spring提供了几种标准的通知类型:
- Before Advice:在方法执行前执行
- After Returning Advice:方法正常返回后执行
- After Throwing Advice:方法抛出异常后执行
- Around Advice:包围方法执行,可以控制是否执行原方法
- Introduction Advice:为类添加新的接口和实现
在mini-spring中,我们通常会先实现最基础的MethodBeforeAdvice:
java复制public interface MethodBeforeAdvice extends BeforeAdvice {
void before(Method method, Object[] args, Object target) throws Throwable;
}
2.3 Advisor:Pointcut和Advice的桥梁
Advisor是Spring AOP中的一个重要抽象,它把Pointcut和Advice组合在一起,告诉AOP框架:"在哪些地方(Pointcut)执行什么操作(Advice)"。
PointcutAdvisor是最常用的Advisor实现,它的核心接口非常简单:
java复制public interface Pointc
