Spring MVC : WebMvcConfigurationSupport 中定义的 HandlerMapping 组件

概述

Spring MVC的缺省配置类WebMvcConfigurationSupport定义了一组HandlerMapping组件到容器,供Spring MVC运行时使用,具体来讲,是被DispatcherServlet使用。本文介绍WebMvcConfigurationSupport定义了哪些HandlerMapping组件,都是什么类型,以及它们的应用目的。

HandlerMapping组件定义

  1. RequestMappingHandlerMapping requestMappingHandlerMapping()
    • bean类型 : RequestMappingHandlerMapping
    • 优先级Order : 0
    • 目的 : 映射请求到控制器方法上
    • Handler 类型 : HandlerMethod
    • bean存在性 : 总是存在
  2. HandlerMapping viewControllerHandlerMapping()
    • bean类型 : SimpleUrlHandlerMapping
    • 优先级Order : 1
    • 目的 : 将URL路径直接映射到view name
    • Handler 类型 : ParameterizableViewController
    • bean存在性 : 添加了至少一条映射时存在
  3. BeanNameUrlHandlerMapping beanNameHandlerMapping()
    • bean类型 : BeanNameUrlHandlerMapping
    • 优先级Order : 2
    • 目的 : 将URL路径直接映射到controller bean name
    • Handler 类型 : 最终使用的handler对象是bean名称对应的bean对象(不确定类型/接口)
    • bean存在性 : 总是存在
  4. HandlerMapping resourceHandlerMapping()
    • bean类型 : SimpleUrlHandlerMapping
    • 优先级Order : Integer.MAX_VALUE-1
    • 目的 : 将URL路径直接映射到静态资源resource上,这里静态资源resource可以是classpath resource也可以是file resource
    • Handler 类型 : ResourceHttpRequestHandler (参考 ResourceHandlerRegistry,实现了接口HttpRequestHandler)
    • bean存在性 : 添加了至少一条映射时存在
  5. HandlerMapping defaultServletHandlerMapping()
    • bean类型 : SimpleUrlHandlerMapping
    • 优先级Order : Integer.MAX_VALUE
    • 目的 : 缺省HandlerMapping,将/**映射到一个DefaultServletHttpRequestHandler
    • Handler 类型 : DefaultServletHttpRequestHandler(实现了接口HttpRequestHandler)
    • bean存在性 : 总是存在

涉及到的HandlerMapping实现类

Spring MVC : WebMvcConfigurationSupport 中定义的 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对象>`对。