SpringBoot一个请求的处理全过程

本文详细梳理了SpringBoot中请求的处理流程,从Tomcat接收请求开始,经过过滤器、拦截器、控制器方法执行、返回值处理、异常解析到最后的视图渲染。重点介绍了各个阶段的功能和执行顺序,包括全局异常处理的机制。对于可能出现的问题,如全局异常处理失效的原因也进行了分析。后续将对请求流程的各个环节做进一步探讨。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


平时只是在用SpringBoot框架,但并没有详细研究过请求执行的一个具体过程,所以本文主要来梳理一下SpringBoot请求处理的全过程。

请求处理流程图

容器包含关系图

请添加图片描述

请求简要流程图

请添加图片描述

请求详细流程图

请添加图片描述

请求处理流程详解

请求处理主要流程

  1. 过滤器链chain.doFilter之前的执行(过滤器是在Server容器中的,如Tomcat);
  2. 拦截器链preHandle方法执行;
  3. 路径映射、参数绑定(参数解析、参数转换、参数校验);
  4. Controller的具体方法执行;
  5. 返回值处理(含信息转换);
  6. 拦截器链postHandle方法执行;
  7. 异常解析器处理异常(@ControllerAdvice、自定义异常解析器都在这里执行);
  8. 视图解析渲染;
  9. 拦截器链afterCompletion方法执行;
  10. 过滤器链chain.doFilter之后的执行。

请求处理详细流程

  1. Tomcat线程接受到请求,经过一系列调用后,调用到ApplicationFilterChain的doFilter方法。doFilter方法调用ApplicationFilterChain的internalDoFilter方法,依次执行过滤器链的每个Filter的doFilter。

  2. 过滤器链的所有doFIlter执行完毕, 控制权交回ApplicationFilterChain, 经过一系列调用后,调用到DispatcherServlet的doDispatch方法。

    doDispatch方法的主要流程:

    1. DispatcherServlet的getHandler方法:得到处理执行器链(包含处理器和拦截器链)。

    2. DispatcherServlet的getHandlerAdapter方法:得到处理器适配器。

    3. HandlerExecutionChain的applyPreHandle方法:执行执行器链中的所有拦截器方法preHandle。

    4. AbstractHandlerMethodAdapter的handle方法:该方法主要包含路径映射、参数bangd (参数解析、参数转换、参数校验)、调用具体控制器方法、返回值处理(含信息转换)等操作。

      handle方法的主要流程:

      1. 调用RequestMappingHandlerAdapter的handleInternal方法,handleInternal方法又调用RequestMappingHandlerAdapter的invokeHandlerMethod方法。

        invokeHandlerMethod方法的主要流程:

        1. 调用RequestMappingHandlerAdapter的createInvocableHandlerMethod方法:注册参数解析器、返回值处理器、信息转化器等到ServletInvocableHandlerMethod 对象实例中。

        2. 调用ServletInvocableHandlerMethod的invokeAndHandle方法。

          invokeAndHandle方法的主要流程:

          1. 调用InvocableHandlerMethod的invokeForRequest方法,invokeForRequest方法又调用InvocableHandlerMethod的doInvoke方法。

            doInvoke方法的主要流程:

            1. 调用InvocableHandlerMethod的getMethodArgumentValues方法:路径映射、参数绑定(参数解析、参数转换、参数校验)。
            2. 调用Method的invoke方法,内部调用DelegatingMethodAccessorImpl的invoke方法,内部调用InvocableHandlerMethod的doInvoke方法,内部调用NativeMethodAccessorImpl的invoke方法,内部调用NativeMethodAccessorImpl的invoke0方法,内部调用具体Controller的具体方法,得到响应结果。
          2. 调用HandlerMethodReturnValueHandlerComposite的handleReturnValue方法:返回值处理(含信息转换)。

    5. 调用HandlerExecutionChain的applyPostHandle方法:执行执行器链中的所有拦截方法postHandle。

    6. 调用DispatcherServlet的processDispatchResult方法。

      processDispatchResult方法的主要流程:

      1. 调用DispatcherServlet的processHandlerException方法:异常处理(获取合适的异常解析器处理异常信息,@ControllerAdvice全局异常处理和自定义异常解析器都是在这一步执行的)。
      2. 调用DispatcherServlet的render方法:视图解析渲染。
      3. 调用HandlerExecutionChain的triggerAfterCompletion方法:执行执行器链中的所有拦截方法afterCompletion。
  3. 控制权交回ApplicationFilterChain , 继续执行过滤器链的所有doFIlter之后的代码。

常见问题

全局异常处理失效

1.@ControllerAdvice作用范围

  • 拦截器的preHandle方法、postHandle方法抛出的异常在ControllerAdvice处理范围内,但拦截器的afterCompletion方法抛出的异常不在处理范围内(拦截器的afterCompletion抛出的异常会被直接catch处理,不会往外抛出异常,只会打印错误日志)。

    HandlerExecutionChain类源码

    void triggerAfterCompletion(HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex)
    			throws Exception {
    
    		HandlerInterceptor[] interceptors = getInterceptors();
    		if (!ObjectUtils.isEmpty(interceptors)) {
    			for (int i = this.interceptorIndex; i >= 0; i--) {
    				HandlerInterceptor interceptor = interceptors[i];
    				try {
    					interceptor.afterCompletion(request, response, this.handler, ex);
    				}
    				catch (Throwable ex2) {
    					logger.error("HandlerInterceptor.afterCompletion threw exception", ex2);
    				}
    			}
    		}
    	}
    
  • 过滤器抛出的异常不在ControllerAdvice处理范围内。如果要处理过滤器抛出的异常,可以自定义Filter并放在过滤链的最前面,catch处理异常。

2.多个@ControllerAdvice优先级问题

  • 多个使用@ControllerAdvice 的Bean按执行顺序(通过Order注解设置执行顺序,值越小月优先执行)依次执行
  • 当某个Bean的方法匹配上异常时,进行异常处理,直接返回,后续的方法和Bean不在执行。

关于全局异常处理详细讲解可参考文章:[SpringBoot全局异常处理](https://blog.csdn.net/JokerLJG/article/details/123297513)

后续文章会继续针对请求流程里面的一些主要功能作深入探讨,如:过滤器拦截器参数解析参数转换参数校验返回值处理异常处理等方面



参考文章:springboot 请求流程简介

### Spring Boot 请求处理流程解析 Spring Boot请求处理流程基于经典的 Servlet 容器模型,其内部机制依赖于 Spring MVC 提供的核心功能。以下是关于 Spring Boot请求处理的具体流程及其图解说明。 #### 1. **Servlet 容器初始化** 当应用程序启动时,Spring Boot 使用嵌入式的 Tomcat 或 Jetty 等作为默认的 Web 容器[^1]。容器会加载 `DispatcherServlet` 并将其注册到上下文中。这是整个请求处理链的第一步。 #### 2. **请求进入 DispatcherServlet** 客户端发起 HTTP 请求后,该请求会被转发至 `DispatcherServlet`。它是 Spring MVC 的核心控制器,负责协调各个组件完成请求处理工作。 #### 3. **过滤器 (Filter) 执行** 在请求到达目标处理器之前,可能会经过一系列的 Filter 链。这些过滤器可以用于日志记录、权限校验或其他预处理逻辑。Filter 是由 Servlet API 提供的标准接口,在 Spring Boot 应用程序中可以通过声明类实现自定义行为。 #### 4. **拦截器 (Interceptor) 调用** 紧随 Filter 后的是 Interceptor 拦截器阶段。与 Filters 不同,Interceptors 属于 Spring MVC 自身的一部分,主要用于业务层面的操作控制,比如身份验证或数据转换等操作。 #### 5. **HandlerMapping 映射** 通过 HandlerMapping 将 URL 地址映射到具体的 Controller 方法上。此过程涉及查找合适的 handler 来匹配当前路径模式,并返回对应的执行对象实例。 #### 6. **Controller 方法调用** 一旦找到适配的方法签名,则触发实际的目标方法运行。此时可能还会经历参数绑定、类型转化等一系列准备工作。 #### 7. **视图解析(ViewResolver)** 如果 controller 返回了一个 ModelAndView 对象或者仅仅是一个字符串形式的名字表示模板名称的话, 接下来就需要借助 ViewResolvers 去定位最终呈现给用户的页面资源文件位置. --- 下面是简化版的请求流链示意图: ```plaintext +-------------------+ | Client Request | +-------------------+ ↓ +-------------------+ | Embedded Container| | (Tomcat etc.)| +-------------------+ ↓ +-------------------+ | DispatcherServlet | +-------------------+ ↓ +-------------------+ | Filters Chain| +-------------------+ ↓ +-------------------+ | Interceptors List| +-------------------+ ↓ +-------------------+ | Handler Mapping | +-------------------+ ↓ +-------------------+ | Target Controller | +-------------------+ ↓ +-------------------+ | Model & View| +-------------------+ ↓ +-------------------+ |View Rendering Logic| +-------------------+ ↓ +-------------------+ | Response Sent| +-------------------+ ``` 以上展示了从接收到发送回响应的整体架构层次结构。 --- ### 关键点总结 - 整个流程始于 Servlet 容器接收原始网络包直至最后形成 HTML 页面反馈给浏览器端结束。 - 在这个过程中穿插有多个可扩展节点(Filters / Interceptors),允许开发人员灵活定制所需的功能特性。 - Spring Boot 继承了 Spring Framework 下成熟的 MVC 设计理念,同时又进一步优化封装降低了使用的复杂度。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值