Spring HandlerMapping

package org.springframework.web.servlet;

import javax.servlet.http.HttpServletRequest;

import org.springframework.lang.Nullable;

public interface HandlerMapping {
    // 省略一下常量配置.....
	/**
	 * 返回此请求的处理程序和任何拦截器。可以根据请求URL、会话状态或实现类选择的任何因素做出选择。
     * 返回的HandlerExecutionChain包含一个处理程序对象,而不是标记接口,因此处理程序不受任何约束。
     * 例如,可以编写HandlerAdapter来允许使用其他框架的处理程序对象。
	 */
	@Nullable
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

根据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方法。
	/**
	 * Initializes the interceptors.
	 * @see #extendInterceptors(java.util.List)
	 * @see #initInterceptors()
	 */
	@Override
	protected void initApplicationContext() throws BeansException {
		extendInterceptors(this.interceptors);
		detectMappedInterceptors(this.adaptedInterceptors);
		initInterceptors();
	}
  • 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