[面试题] Spring AOP 是如何匹配切点并形成拦截器调用链的?
📖 版块 A:知识讲解版 (温故知新)
-
AOP 生成代理只是第一步:
- 真正调用方法时,Spring 还要判断这个方法是否匹配切点,以及要执行哪些增强逻辑。
-
核心参与者:
- Advisor:封装了切点(Pointcut)和增强逻辑(Advice)。
- Pointcut:负责判断类和方法是否匹配。
- MethodInterceptor:Spring AOP 中常见的增强执行单元。
-
匹配流程:
- 先根据类过滤器判断目标类是否匹配。
- 再根据方法匹配规则判断当前方法是否命中切点。
- 把命中的增强逻辑组装成一条拦截器链。
-
执行流程:
- 调用目标方法时,Spring 会创建
MethodInvocation。 proceed()会递归推进调用链。- 如果还有下一个拦截器,就继续调用下一个。
- 如果拦截器执行完了,才真正执行目标方法。
- 调用目标方法时,Spring 会创建
🎤 版块 B:面试实战版 (高手逐字稿)
Q:Spring AOP 是如何匹配切点并形成拦截器调用链的?
💬 高手逐字稿:
Spring AOP 在生成代理对象之后,并不是所有方法调用都会被一股脑增强。它还要做两件事:先判断当前方法到底匹不匹配切点,再把所有命中的增强逻辑按顺序串成一条执行链。
这里最核心的概念是 Advisor。Advisor 其实就是把“切点规则”和“增强逻辑”绑定在一起的一个包装体。也就是说,Spring 不是直接拿注解去拦方法,而是先把切面信息抽象成 Advisor。
当代理对象的方法被调用时,Spring 会先根据 Pointcut 去做匹配。这个匹配一般分两层:先看当前目标类是不是命中,再看当前具体方法是不是命中。如果匹配成功,就把这个 Advisor 对应的增强逻辑转换成 MethodInterceptor,然后按顺序组装成一个拦截器链。
接下来真正执行时,Spring 会创建一个 MethodInvocation,里面持有目标对象、当前方法、参数以及整条拦截器链。然后通过 proceed() 递归推进:
- 如果还有下一个拦截器,就先执行下一个拦截器的
invoke(); - 如果链已经走完了,才真正执行目标方法本身。
所以你可以把 Spring AOP 的执行模型理解成一层层“套娃”。每个拦截器都包住下一个拦截器,最里面才是原始方法。
这也是为什么事务、日志、权限这些能力都可以统一落在 AOP 上,因为它们本质上都只是这条拦截器调用链中的某一个环节。
最后更新于: