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分析
- 是HandlerMapping默认实现抽象类, 所有子类全部继承此类。用到了模板设计模式。
- 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类型的)
- AbstractHandlerMapping中Interceptor集合,
interceptors
,adaptedInterceptors
- interceptors: 所有的拦截器。只用于配置
- adaptedInterceptors: HandlerInterceptor类型的拦截器
- mappedInterceptors: 集合已经废弃
- 两大子类
AbstractUrlHandlerMapping
AbstractHandlerMethodMapping
评论