Handler Mapping 是spring在通过http请求匹配对应处理的核心逻辑,今天在调查springboot错误码处理时又重新看了一下对应的实现,就重新温习一下对应的逻辑。
1. 整体结构
1.1 HandlerMapping 接口
这个接口的实现用于映射 Http 请求和对应的处理实例。
系统开发者可以自己实现这个接口,当然并不是时时都需要这样,因为 Spring 框架已经提供了很多的默认实现帮助你解决问题,例如:BeanNameUrlHandlerMapping
和 RequestMappingHandlerMapping
。如果在应用中没有配置对应的 HandlerMapping 实例,前面两个也是对应的默认实现。
如果你需要的化,HandlerMapping 的实现可以支持对应的映射拦截器(interceptor)。同时一个具体的处理器通常被HandlerExecutionChain
实例包装,可以选择的使用映射拦截器(HandlerInterceptor)来协同处理相关的业务。DispatcherServlet 会首先按照给定顺序进行调用 HandlerInterceptor 的 preHandle
方法,如果所有的 HandlerInterceptor 的
preHandle 方法都返回true
, 再调用 Hander 自己。
在 Spring MVC 框架中,参数化映射是一个非常重要并且十分奏效的能力。例如,你很有可能使用 sesson 状态、cookie 状态或者其他变量来个性化定义一个自己的映射器。好像没有任何其他的 MVC 框架有如此的灵活性。
对应自己实现实例也可以实现 spring 中 Ordered 接口,以便指定对应的执行顺序。DispatcherServlet 在使用 Mapping 前会先排序(升序,数字越小越先执行)。 如果没有实现 Ordered 接口,被默认为最低优先级,即最后执行。
1.2 实现层次结构
Spring 框架已经对 HandlerMapping 做了丰富的扩展,整体结构图如下:
在接口层面,如果是想通过匹配的方式来定义映射,可以实现MatchableHandlerMapping
。 在 MatchableHandlerMapping 中定义了match
方法;
AbstractHandlerMapping
是所有HandlerMapping实例的超类。提供了排序、默认Handler、Handler 拦截器功能,同时还包含了通过路径匹配的映射 Handler 拦截器。