Spring MVC 请求处理的核心流程
**** Spring MVC 中 HandlerMapping 和 HandlerAdapter 的工作机制,特别关注了如何将请求映射到合适的控制器方法或处理器对象,以及它们如何被调用。以下是对话的主要内容总结:
Spring MVC 请求处理流程:
当请求到达 DispatcherServlet 时,Spring MVC 会依次调用配置的 HandlerMapping 实例,找到匹配的处理器(Handler)并封装成 HandlerExecutionChain。
然后通过 getHandlerAdapter 方法找到支持该 handler 的 HandlerAdapter,从而调用合适的处理器。
HandlerMapping 和 HandlerAdapter 的关系:
HandlerMapping 负责查找处理器,而 HandlerAdapter 则负责调用处理器的具体逻辑。
HandlerMapping 不直接与 HandlerAdapter 关联,而是通过 DispatcherServlet 的 getHandlerAdapter 方法动态确定合适的适配器。
RequestMappingHandlerMapping:
RequestMappingHandlerMapping 是 Spring MVC 中最常用的 HandlerMapping,它会扫描所有带有 @Controller 和 @RestController 注解的类,查找带 @RequestMapping、@GetMapping 等注解的方法。
这些方法会被封装为 HandlerMethod 对象,HandlerMethod 包含了控制器实例、方法对象、方法参数等信息,便于后续统一调用。
HandlerMethod vs HttpRequestHandler:
HandlerMethod 是 Spring MVC 的标准处理器类型,适用于基于注解的控制器方法,包括 @Controller 和 @RestController 注解的类。
HttpRequestHandler 是一个较低级的接口,适用于需要直接操作 HttpServletRequest 和 HttpServletResponse 的场景,例如文件下载、动态内容生成等。
SimpleUrlHandlerMapping 与 HttpRequestHandler 的使用:
SimpleUrlHandlerMapping 可以将 URL 路径映射到 HttpRequestHandler 类型的处理器,适合特殊用途的请求处理。
通过配置 SimpleUrlHandlerMapping,Spring MVC 可以将特定的 URL 路径映射到实现了 HttpRequestHandler 的处理器对象,并通过 HttpRequestHandlerAdapter 调用。
关键结论
注解驱动的控制器(@Controller 和 @RestController)的 handler 类型为 HandlerMethod,它由 RequestMappingHandlerMapping 创建和管理。
HandlerAdapter 是根据 supports 方法动态确定的,DispatcherServlet 会选择合适的 HandlerAdapter 适配器来调用对应的处理器类型。
HttpRequestHandler 是 Spring MVC 的一种特殊处理器类型,不适用于常规的控制器类,而是用于特殊的 HTTP 请求处理场景