Spring MVC : WebMvcConfigurationSupport 中定义的 HandlerMapping 组件

本文解析SpringMVC中各类HandlerMapping组件的作用与类型,包括RequestMappingHandlerMapping、viewControllerHandlerMapping、BeanNameUrlHandlerMapping、resourceHandlerMapping及defaultServletHandlerMapping,阐述其在Web请求处理流程中的关键角色。

概述

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(Controller实现类)
    • bean存在性 : 添加了至少一条映射时存在
  3. BeanNameUrlHandlerMapping beanNameHandlerMapping()
    • bean类型 : BeanNameUrlHandlerMapping
    • 优先级Order : 2
    • 目的 : 将URL路径直接映射到controller bean name
    • Handler 类型 : 最终使用的handler对象是bean名称对应的bean对象(不确定类型/接口,通常是Controller实现类)
    • 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 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对象>对。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值