Spring 源码

Spring MVC- HandlerMapping

2019-05-19  本文已影响17人  红衣落桂花

带着几个问题来了解Handler Mapping.

  1. 什么是HandlerMapping, 它在Spring mvc 的处理流程中充当什么角色?

  2. Spring MVC 自带哪几种类型的HandlerMapping? 这些是针对什么情况设计的?

  3. 怎样自定义HandlerMapping?

  4. HandlerMapping 怎样获取HandlerExecutionChain, 即它的工作流程是什么?

问题1: 什么是HandlerMapping, 它在Spring mvc 的处理流程中充当什么角色?

HandlerMapping 用来根据http请求选择合适的controller & Interceptor。从下图中可以看出HM 在Spring MVC 中所处的位置。

image

问题2,Spring MVC 自带哪几种类型的HandlerMapping? 这些是针对什么情况设计的?

Spring MVC 自带4种HM, 他们是:DefaultAnnotationHandlerMapping, SimpleUrlHandlerMapping, BeanNameUrlHandlerMapping, ControllerClassNameHandlerMapping

如果没有在配置文件中指定 HandlerMapping, 就会使用spring 自带配置文件中的配置信息, 该配置文件是:DispatcherServlet.properties , 该配置文件中还有 theme, adapter 等的默认配置。 代码如下(Spring 版本:4.3.9):


org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver

org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
    org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping

org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter

详细介绍上面的四种HandlerMapping之前, 先说下HandlerMapping 的继承关系。

image

SimpleUrlHandlerMapping: 是通过配置mappings的参数,显示的指定url和Controller关联。

DefaultAnnotationHandlerMapping: 扫描具体的包下使用了@Controller注解的类。这样能实现请求和Controller的关联。(在spring 3.2 版本时被弃用,被RequestMappingHandlerMapping 取代)

BeanNameUrlHandlerMapping: 是URL就是Controller这个bean的name。需要规范url.

ControllerClassNameHandlerMapping: 是URL就说Controller这个bean的类名去掉Controller后的String。也需要规范url. (在spring 4.3版本时被弃用, in favor of annotation-driven handler methods)

问题3. 怎样自定义HandlerMapping, 并使之生效?

自定义:public class MyHandlerMapping extends AbstractDetectingUrlHandlerMapping, 也可以根据上面的类图根据不同的需求,继承不同的类。

在配置文件中使扫描路径包含MyHandlerMapping 所在package.

问题4. HandlerMapping 怎样获取HandlerExecutionChain, 即它的工作流程是什么?

上一篇下一篇

猜你喜欢

热点阅读