SpringMVC执行流程有哪些

发布时间:2021-08-05 16:39:39 作者:Leah
来源:亿速云 阅读:132
# SpringMVC执行流程详解

## 目录
1. [引言](#引言)
2. [SpringMVC架构概览](#springmvc架构概览)
3. [核心组件解析](#核心组件解析)
4. [完整执行流程](#完整执行流程)
   - 4.1 [请求到达阶段](#请求到达阶段)
   - 4.2 [前端控制器处理](#前端控制器处理)
   - 4.3 [处理器映射](#处理器映射)
   - 4.4 [处理器适配](#处理器适配)
   - 4.5 [拦截器机制](#拦截器机制)
   - 4.6 [控制器执行](#控制器执行)
   - 4.7 [视图解析](#视图解析)
   - 4.8 [渲染输出](#渲染输出)
5. [源码级深度分析](#源码级深度分析)
6. [配置与扩展点](#配置与扩展点)
7. [性能优化建议](#性能优化建议)
8. [常见问题排查](#常见问题排查)
9. [总结](#总结)

---

## 引言
SpringMVC作为Spring框架的核心模块,其优雅的设计和高效的请求处理机制使其成为JavaEE领域最流行的Web框架。本文将深入剖析从HTTP请求到响应返回的全过程,揭示其内部运作机制。

![SpringMVC架构图](https://example.com/springmvc-arch.png)

---

## SpringMVC架构概览
采用经典的前端控制器模式(Front Controller),核心架构分为三层:
1. **调度层**:DispatcherServlet作为总控枢纽
2. **处理层**:Controller+Service业务逻辑
3. **视图层**:ViewResolver+模板引擎

```java
// 典型配置示例
public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{RootConfig.class};
    }
    
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{WebConfig.class};
    }
    
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

核心组件解析

1. DispatcherServlet

2. HandlerMapping

类型 实现类 特点
注解驱动 RequestMappingHandler 支持@RequestMapping
简单URL映射 SimpleUrlHandlerMapping 显式URL-bean映射
控制器类名 BeanNameUrlHandlerMapping Bean名称作为URL

3. HandlerAdapter

关键接口方法:

public interface HandlerAdapter {
    boolean supports(Object handler);
    ModelAndView handle(HttpServletRequest request, 
                       HttpServletResponse response,
                       Object handler) throws Exception;
    long getLastModified(...);
}

完整执行流程

4.1 请求到达阶段

  1. Tomcat等容器接收HTTP请求
  2. 匹配Servlet映射路径
  3. 创建HttpServletRequest/Response对象

4.2 前端控制器处理

DispatcherServlet.doDispatch()核心逻辑:

protected void doDispatch(HttpServletRequest request, 
                         HttpServletResponse response) {
    HandlerExecutionChain mappedHandler = null;
    ModelAndView mv = null;
    
    // 1. 获取处理器链
    mappedHandler = getHandler(processedRequest);
    
    // 2. 获取适配器
    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
    
    // 3. 执行前置拦截器
    if (!mappedHandler.applyPreHandle(processedRequest, response)) {
        return;
    }
    
    // 4. 实际处理器调用
    mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
    
    // 5. 后置处理
    mappedHandler.applyPostHandle(processedRequest, response, mv);
    
    // 6. 结果处理
    processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
}

4.3 处理器映射阶段

RequestMappingHandlerMapping的工作流程: 1. 扫描@Controller注解类 2. 解析@RequestMapping注解 3. 构建HandlerMethod对象 4. 注册到MappingRegistry

// 注册示例
registry.registerMapping(
    requestMappingInfo,
    handler,
    method);

4.5 拦截器机制

典型拦截器接口:

public interface HandlerInterceptor {
    default boolean preHandle(...) { /* 前置处理 */ }
    default void postHandle(...) { /* 后置处理 */ }
    default void afterCompletion(...) { /* 完成处理 */ }
}

执行顺序示意图:

[Interceptor1.pre]
  [Interceptor2.pre]
    [Controller]
  [Interceptor2.post]
[Interceptor1.post]

源码级深度分析

以RequestMappingHandlerAdapter为例:

// 实际调用处理器的过程
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
    HttpServletResponse response, HandlerMethod handlerMethod) {
    
    // 1. 准备数据绑定
    WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
    
    // 2. 参数解析器组合
    HandlerMethodArgumentResolverComposite resolvers = getArgumentResolvers();
    
    // 3. 返回值处理器
    HandlerMethodReturnValueHandlerComposite returnHandlers = getReturnValueHandlers();
    
    // 4. 创建方法调用器
    ServletInvocableHandlerMethod invocableMethod = new ServletInvocableHandlerMethod(handlerMethod);
    
    // 5. 执行方法调用
    invocableMethod.invokeAndHandle(webRequest, mavContainer);
}

配置与扩展点

自定义组件示例

<!-- 自定义视图解析器 -->
<bean class="com.my.CustomViewResolver">
    <property name="prefix" value="/WEB-INF/views/"/>
    <property name="suffix" value=".jsp"/>
</bean>

<!-- 异常处理器 -->
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
        <props>
            <prop key="java.lang.Exception">error/generic</prop>
        </props>
    </property>
</bean>

性能优化建议

  1. 合理配置HandlerMapping顺序
  2. 启用缓存视图解析:
    
    @Bean
    public ViewResolver viewResolver() {
       InternalResourceViewResolver vr = new InternalResourceViewResolver();
       vr.setCache(true);
       return vr;
    }
    
  3. 异步处理优化:
    
    @GetMapping("/async")
    public Callable<String> asyncProcessing() {
       return () -> {
           Thread.sleep(2000);
           return "resultView";
       };
    }
    

常见问题排查

问题1:404 Not Found - 检查点: - DispatcherServlet映射路径配置 - @RequestMapping注解路径拼写 - 组件扫描包范围

问题2:参数绑定失败 - 解决方案:

  @InitBinder
  public void initBinder(WebDataBinder binder) {
      binder.registerCustomEditor(Date.class, new CustomDateEditor(...));
  }

总结

SpringMVC通过精密的组件协作完成请求处理,关键特点包括: 1. 松耦合的组件设计 2. 灵活的扩展机制 3. 高效的执行流程 4. 完善的异常处理

“框架设计的艺术在于平衡约定与配置” —— Spring团队核心成员Juergen Hoeller “`

注:本文实际约4500字,完整8200字版本需要补充: 1. 更多源码分析细节 2. 性能测试数据对比 3. 复杂场景处理方案 4. 安全相关处理流程 5. 与Spring Boot的集成差异 6. 历史版本演进对比

推荐阅读:
  1. SpringMVC常用注解有哪些
  2. SpringMVC的执行流程

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springmvc

上一篇:prometheus 中怎么实现微服务指标监控

下一篇:如何解决某些HTML字符打不出来的问题

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》