2023-09-28 15:05:59
RequestMappingHandlerMapping 详解
一、概述
RequestMappingHandlerMapping 是 Spring MVC 框架中的一个核心组件,它负责将 HTTP 请求映射到具体的处理器(Handler)上。在 Spring MVC 的架构中,RequestMappingHandlerMapping 通过解析带有 @RequestMapping 注解的控制器(Controller)方法,构建请求与处理器之间的映射关系,并在请求到来时,根据请求的 URL 路径找到对应的处理器进行处理。
二、加载过程
RequestMappingHandlerMapping 的加载过程主要发生在 DispatcherServlet 的初始化阶段。DispatcherServlet 是 Spring MVC 的前端控制器,它负责接收所有的 HTTP 请求,并根据请求找到对应的处理器进行处理。在 DispatcherServlet 的初始化过程中,会自动加载所有实现 HandlerMapping 接口的 Bean,包括 RequestMappingHandlerMapping。
自动加载:DispatcherServlet 在初始化时,会调用 initHandlerMappings 方法,该方法会皮扮遍历 Spring 容器中的所有 Bean,找到所有实现 HandlerMapping 接口的 Bean,并将它们添加到 handlerMappings 列表中。RequestMappingHandlerMapping 就是在这个过程中被自动加载的。
优先级设置:在加载 HandlerMapping 时,可以通过 setOrder 方法来设置它们的优先级。Spring MVC 默认会加载 RequestMappingHandlerMapping、BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping 等,并按照设置的优先级顺序使用。
初始化:RequestMappingHandlerMapping 实现了 InitializingBean 接口,因此在 Bean 加载完成后,会自动调用 afterPropertiesSet 方法进行初始化。在这个方法中,会调用 initHandlerMethods 方法来遍历所有 Bean,找到带有 @Controller 或 @RequestMapping 注解的 Bean,并进一步处理它们的方法,构建请求与处理器之间的映射关系。
三、初始化过闭握兆程
RequestMappingHandlerMapping 的初始化过程主要包括以下几个步骤:
遍历所有 Bean:通过 obtainApplicationContext().getBeanNamesForType(Object.class) 方法获取 Spring 容器中的所有 Bean 名称,并遍历这些 Bean。
判断是否为处理器:对于每个 Bean,通过 isHandler 方法判断它是否是一个处理器。判断的依据是 Bean 的类型是否带有 @Controller 或 @RequestMapping 注解。
检测处理器方法:如果 Bean 是一个处理器,那么会调用 detectHandlerMethods 方法来检测该 Bean 中的所有方法,找到带有 @RequestMapping 注解的方法,并根据注解配置的信息构建 RequestMappingInfo 对象。
注册处理器方法:将构建好的 RequestMappingInfo 对象和对应的处理器方法注册到 MappingRegistry 中,完成请求与处理器之间的映射关系构建。
四、解轿租析过程
当 HTTP 请求到达 DispatcherServlet 时,DispatcherServlet 会根据请求的 URL 路径找到对应的处理器来处理该请求。这个过程中,RequestMappingHandlerMapping 会起到关键作用。
遍历 HandlerMapping:DispatcherServlet 会遍历 handlerMappings 列表中的所有 HandlerMapping 对象,调用它们的 getHandler 方法来尝试找到与请求匹配的处理器。
匹配请求:RequestMappingHandlerMapping 的 getHandler 方法会根据请求的 URL 路径,在已注册的处理器方法中找到最为匹配的 HandlerMethod。匹配的过程主要依赖于 RequestMappingInfo 对象中的信息。
构建 HandlerExecutionChain:找到匹配的 HandlerMethod 后,RequestMappingHandlerMapping 会根据配置的 HandlerInterceptor 构建一个 HandlerExecutionChain 对象,并将其返回给 DispatcherServlet。
处理请求:DispatcherServlet 得到 HandlerExecutionChain 后,会选择合适的 HandlerAdapter 来执行对应的处理器方法,获取返回值,并根据返回值类型决定用什么方式展示给用户。
五、总结
RequestMappingHandlerMapping 是 Spring MVC 框架中的一个核心组件,它负责将 HTTP 请求映射到具体的处理器上。通过解析带有 @RequestMapping 注解的控制器方法,构建请求与处理器之间的映射关系,并在请求到来时,根据请求的 URL 路径找到对应的处理器进行处理。了解 RequestMappingHandlerMapping 的工作原理,有助于深入理解 Spring MVC 的请求处理流程。