Spring MVC : WebMvcConfigurationSupport 中定义的 HandlerMapping 组件
概述
Spring MVC
的缺省配置类WebMvcConfigurationSupport
定义了一组HandlerMapping
组件到容器,供Spring MVC
运行时使用,具体来讲,是被DispatcherServlet
使用。本文介绍WebMvcConfigurationSupport
定义了哪些HandlerMapping
组件,都是什么类型,以及它们的应用目的。
HandlerMapping
组件定义
-
RequestMappingHandlerMapping requestMappingHandlerMapping()
-
bean
类型 :RequestMappingHandlerMapping
- 优先级
Order
: 0 - 目的 : 映射请求到控制器方法上
-
Handler
类型 :HandlerMethod
-
bean
存在性 : 总是存在
-
-
HandlerMapping viewControllerHandlerMapping()
-
bean
类型 :SimpleUrlHandlerMapping
- 优先级
Order
: 1 - 目的 : 将
URL
路径直接映射到view name
上 -
Handler
类型 :ParameterizableViewController
-
bean
存在性 : 添加了至少一条映射时存在
-
-
BeanNameUrlHandlerMapping beanNameHandlerMapping()
-
bean
类型 :BeanNameUrlHandlerMapping
- 优先级
Order
: 2 - 目的 : 将
URL
路径直接映射到controller bean name
上 -
Handler
类型 : 最终使用的handler
对象是bean
名称对应的bean
对象(不确定类型/接口) -
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
对象>`对。