Skip to Content
面试题库Spring Core[面试题] Spring AOP 是如何匹配切点并形成拦截器调用链的?

[面试题] Spring AOP 是如何匹配切点并形成拦截器调用链的?

📖 版块 A:知识讲解版 (温故知新)

  • AOP 生成代理只是第一步

    1. 真正调用方法时,Spring 还要判断这个方法是否匹配切点,以及要执行哪些增强逻辑。
  • 核心参与者

    1. Advisor:封装了切点(Pointcut)和增强逻辑(Advice)。
    2. Pointcut:负责判断类和方法是否匹配。
    3. MethodInterceptor:Spring AOP 中常见的增强执行单元。
  • 匹配流程

    1. 先根据类过滤器判断目标类是否匹配。
    2. 再根据方法匹配规则判断当前方法是否命中切点。
    3. 把命中的增强逻辑组装成一条拦截器链。
  • 执行流程

    1. 调用目标方法时,Spring 会创建 MethodInvocation
    2. proceed() 会递归推进调用链。
    3. 如果还有下一个拦截器,就继续调用下一个。
    4. 如果拦截器执行完了,才真正执行目标方法。

🎤 版块 B:面试实战版 (高手逐字稿)

Q:Spring AOP 是如何匹配切点并形成拦截器调用链的?

💬 高手逐字稿

Spring AOP 在生成代理对象之后,并不是所有方法调用都会被一股脑增强。它还要做两件事:先判断当前方法到底匹不匹配切点,再把所有命中的增强逻辑按顺序串成一条执行链。

这里最核心的概念是 Advisor。Advisor 其实就是把“切点规则”和“增强逻辑”绑定在一起的一个包装体。也就是说,Spring 不是直接拿注解去拦方法,而是先把切面信息抽象成 Advisor。

当代理对象的方法被调用时,Spring 会先根据 Pointcut 去做匹配。这个匹配一般分两层:先看当前目标类是不是命中,再看当前具体方法是不是命中。如果匹配成功,就把这个 Advisor 对应的增强逻辑转换成 MethodInterceptor,然后按顺序组装成一个拦截器链。

接下来真正执行时,Spring 会创建一个 MethodInvocation,里面持有目标对象、当前方法、参数以及整条拦截器链。然后通过 proceed() 递归推进:

  • 如果还有下一个拦截器,就先执行下一个拦截器的 invoke()
  • 如果链已经走完了,才真正执行目标方法本身。

所以你可以把 Spring AOP 的执行模型理解成一层层“套娃”。每个拦截器都包住下一个拦截器,最里面才是原始方法。

这也是为什么事务、日志、权限这些能力都可以统一落在 AOP 上,因为它们本质上都只是这条拦截器调用链中的某一个环节。

最后更新于:
⏱️

登录后开始阅读

当前 MVP 版本只开放邮箱密码登录注册。完成登录后即可进入面试题内容。

还没有账号?先去注册