Advisor 是 Advice 的容器和调度入口,封装 Advice 与 Pointcut 并通过适配器转为 MethodInterceptor,构成代理拦截器链;运行期由拦截器触发 Advice 逻辑,Advisor 仅在初始化阶段装配后退场。

Advisor 和 Advice 在 Spring AOP 中不是并列关系,而是包装与被包装的关系:Advisor 持有 Advice,并决定它在哪些连接点(Joinpoint)上生效——也就是把“做什么”(Advice)和“在哪做”(Pointcut)绑在一起,形成可被代理机制识别和调度的完整增强单元。
Advisor 是 Advice 的容器和调度入口
Spring 不直接执行 Advice,而是通过 Advisor 统一管理。每个 Advisor 实例内部封装一个 Advice 和一个 Pointcut:
- Pointcut 负责匹配方法——比如
execution(* com.example.service.UserServiceImpl.*(..)),筛选出所有需要增强的方法签名 - Advice 定义具体逻辑——比如前置校验、日志打印、事务开启等,但本身不关心作用范围
- 只有组合成 Advisor 后,Spring 才知道“对 UserServiceImpl 的所有方法,在执行前运行这个校验逻辑”
Advice 被适配为 MethodInterceptor 才能真正执行
原始的 Advice(如 BeforeAdvice、AfterReturningAdvice)不能直接参与调用链,Spring 内部通过适配器模式将其转为统一的 MethodInterceptor 接口实现:
-
MethodBeforeAdviceInterceptor包装BeforeAdvice -
AfterReturningAdviceInterceptor包装AfterReturningAdvice -
ThrowsAdviceInterceptor包装ThrowsAdvice -
AspectJAroundAdvice直接实现MethodInterceptor(因为 @Around 本身已具备完整控制能力)
这些拦截器构成代理对象的拦截器链(List<Object> chain),按 Advisor 注册顺序依次执行。
立即学习“Java免费学习笔记(深入)”;
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
代理创建时,Advisor 列表决定拦截器链结构
当你使用 ProxyFactory 或启用 @EnableAspectJAutoProxy 时,Spring 会:
- 扫描所有被注册的 Advisor(包括 @Aspect 解析出的多个 Advisor)
- 对每个 Advisor,调用其
getAdvice()获取 Advice,再通过AdvisorAdapter转为MethodInterceptor - 将转换后的拦截器按顺序加入链表,最终注入到 JDK Proxy 或 CGLIB 生成的代理对象中
所以,你加一个 @Before 注解,Spring 就会创建一个 InstantiationModelAwarePointcutAdvisorImpl,里面包着一个 AspectJExpressionPointcut 和一个 MethodBeforeAdvice ——这就是 Advisor 和 Advice 协同工作的最小闭环。
执行时,Advisor 不参与运行,Advice 的逻辑由拦截器触发
方法调用到达代理对象后,实际执行的是 ReflectiveMethodInvocation.proceed(),它按序遍历拦截器链:
- 每个
MethodInterceptor调用自己的invoke() - 该方法内部才真正调用原始 Advice 的逻辑(如
before(method, args, target)) - Advisor 本身在运行期不出现,它只在初始化阶段完成“组装+注册”,之后就退场了
换句话说:Advisor 是配置阶段的“装配说明书”,Advice 是运行阶段的“操作步骤”,而拦截器是把说明书翻译成机器能跑的指令。

















