概述
Spring MVC的缺省配置类WebMvcConfigurationSupport定义了一组HandlerMapping组件到容器,供Spring MVC运行时使用,具体来讲,是被DispatcherServlet使用。本文介绍WebMvcConfigurationSupport定义了哪些HandlerMapping组件,都是什么类型,以及它们的应用目的。
HandlerMapping组件定义
RequestMappingHandlerMapping requestMappingHandlerMapping()bean类型 :RequestMappingHandlerMapping- 优先级
Order: 0 - 目的 : 映射请求到控制器方法上
Handler类型 :HandlerMethodbean存在性 : 总是存在
HandlerMapping viewControllerHandlerMapping()bean类型 :SimpleUrlHandlerMapping- 优先级
Order: 1 - 目的 : 将
URL路径直接映射到view name上 Handler类型 :ParameterizableViewController(Controller实现类)bean存在性 : 添加了至少一条映射时存在
BeanNameUrlHandlerMapping beanNameHandlerMapping()bean类型 :BeanNameUrlHandlerMapping- 优先级
Order: 2 - 目的 : 将
URL路径直接映射到controller bean name上 Handler类型 : 最终使用的handler对象是bean名称对应的bean对象(不确定类型/接口,通常是Controller实现类)bean存在性 : 总是存在
HandlerMapping resourceHandlerMapping()bean类型 :SimpleUrlHandlerMapping- 优先级
Order:Integer.MAX_VALUE-1 - 目的 : 将
URL路径直接映射到静态资源resource上,这里静态资源resource可以是classpath resource也可以是file resource。 Handler类型 :ResourceHttpRequestHandler(参考ResourceHandlerRegistry,实现了接口HttpRequestHandler)bean存在性 : 添加了至少一条映射时存在
HandlerMapping defaultServletHandlerMapping()bean类型 :SimpleUrlHandlerMapping- 优先级
Order:Integer.MAX_VALUE - 目的 : 缺省
HandlerMapping,将/**映射到一个DefaultServletHttpRequestHandler Handler类型 :DefaultServletHttpRequestHandler(实现了接口HttpRequestHandler)bean存在性 : 总是存在
涉及到的HandlerMapping实现类

1.RequestMappingHandlerMapping
使用一个MappingRegistry mappingRegistry管理映射关系。
MappingRegistry管理对应于每个控制器方法的一个三元组<RequestMappingInfo对象,控制器对象,控制器方法(Method对象)>。
这个三元组中,RequestMappingInfo对象一一对应于某个检测到的控制器方法,是基于对应控制器方法的元数据所构建的请求映射信息载体。
虽然
MappingRegistry管理的是这样的三元组,实际上存储结构并不是这些三元组,而是经过处理之后的其他形式。
在RequestMappingHandlerMapping bean初始化时检测容器中所有的控制器方法并登记。
控制器方法检测标准 :
- 控制器类 : 使用了注解
@Controller,或者使用了注解@RequestMapping。 - 控制器方法 : 控制器类中使用了注解
@RequestMapping的实例方法(可以是private/protected方法)。
2.BeanNameUrlHandlerMapping
在设置ApplicationContext时,过滤容器中所有/开头的bean名称或者别名,这些bean名称/别名其实是url,如果检测到这样的bean名称/别名,则将每个这样的bean名称/别名和对应的bean名称增加为一个映射项。使用Map<String, Object> handlerMap(定义在AbstractUrlHandlerMapping中)保存映射关系<url pattern,handler对象>对。
3.SimpleUrlHandlerMapping
在设置ApplicationContext之前使用Map<String, Object> urlMap接收外部添加的映射关系<url pattern,handler对象>对,设置ApplicationContext时使用Map<String, Object> handlerMap(定义在AbstractUrlHandlerMapping中)保存映射关系<url pattern,handler对象>对。
本文解析SpringMVC中各类HandlerMapping组件的作用与类型,包括RequestMappingHandlerMapping、viewControllerHandlerMapping、BeanNameUrlHandlerMapping、resourceHandlerMapping及defaultServletHandlerMapping,阐述其在Web请求处理流程中的关键角色。
6150

被折叠的 条评论
为什么被折叠?



