Spring HandlerMapping

 1package org.springframework.web.servlet;
 2
 3import javax.servlet.http.HttpServletRequest;
 4
 5import org.springframework.lang.Nullable;
 6
 7public interface HandlerMapping {
 8    // 省略一下常量配置.....
 9	/**
10	 * 返回此请求的处理程序和任何拦截器。可以根据请求URL、会话状态或实现类选择的任何因素做出选择。
11     * 返回的HandlerExecutionChain包含一个处理程序对象,而不是标记接口,因此处理程序不受任何约束。
12     * 例如,可以编写HandlerAdapter来允许使用其他框架的处理程序对象。
13	 */
14	@Nullable
15	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
16}

根据Request查找Handler和 Interceptors 。获取Handler的过程是通过实现AbstractHandlerMapping的getHandlerInternal模板方法的子类处理。AbstractHandlerMapping中保存了所有配置(interceptors集合、HandlerInterceptor集合、排序、bean的名字等),在获取到Handler后内部会从Request中提取lookupPath将对应的Interceptors装配。同时也暴露给子类设置自己的Interceptors。

HandlerMapping结构

ControllerClassNameHandlerMapping, 类已经从4.3废弃, 5.x以后被移除。 详情和废弃原因

AbstractHandlerMapping分析

  1. 是HandlerMapping默认实现抽象类, 所有子类全部继承此类。用到了模板设计模式。

  1. AbstractHandlerMapping继承了WebApplicationObjectSupport。初始化阶段会自动调用initApplicationContext方法。
 1	/**
 2	 * Initializes the interceptors.
 3	 * @see #extendInterceptors(java.util.List)
 4	 * @see #initInterceptors()
 5	 */
 6	@Override
 7	protected void initApplicationContext() throws BeansException {
 8		extendInterceptors(this.interceptors);
 9		detectMappedInterceptors(this.adaptedInterceptors);
10		initInterceptors();
11	}
  • extendInterceptors: 模板方法。提供给子类一个添加(修改)Interceptors的入口。
  • detectMappedInterceptors: 子类调用,将MappedInterceptor(实现了HandlerInterceptor接口)类型的bean添加到 adaptedInterceptors (HandlerInterceptor类型)中。
  • initInterceptors: 初始化Interceptor,根据类型添加到adaptInterceptor集合中(只接受实现HandlerInterceptor,WebRequestInterceptor类型的)
  1. AbstractHandlerMapping中Interceptor集合, interceptors, adaptedInterceptors
  • interceptors: 所有的拦截器。只用于配置
  • adaptedInterceptors: HandlerInterceptor类型的拦截器
  • mappedInterceptors: 集合已经废弃
  1. 两大子类AbstractUrlHandlerMapping AbstractHandlerMethodMapping