HandlerMapping
HandlerMapping定义了请求和请求处理器之间的映射关系,框架的实现类有:BeanNameUrlHandlerMapping和RequestMappingHandlerMapping等 请求处理器handler总是被HandlerExecutionChain包装的,DispatcherServlet按照顺序调用每个拦截器的preHandle方法,如果所有的preHandle返回true,再最后调用处理器,最后倒序调用postHandle。
一、HandlerMapping接口
HandlerMapping接口定义了部分常量和一个getHandler方法,该方法根据HttpServletRequest请求对象返回HandlerExecutionChain
public interface HandlerMapping {
@Nullable
HandlerExecutionChain getHandler ( HttpServletRequest request) throws Exception;
}
二、HandlerExecutionChain
HandlerExecutionChain代表请求处理器链(Handler execution chain),由请求处理器和请求拦截器组成。它封装了全部的HandlerInterceptor拦截器并且包含处理器handler,提供了调用拦截器和handler的方法 下面是部分源码和注释,一些简单的get属性的方法和简单代码已经省略
public class HandlerExecutionChain {
private final Object handler;
@Nullable
private HandlerInterceptor[ ] interceptors;
@Nullable
private List< HandlerInterceptor> interceptorList;
private int interceptorIndex = - 1 ;
public HandlerExecutionChain ( Object handler, @Nullable HandlerInterceptor. . . interceptors) {
if ( handler instanceof HandlerExecutionChain ) {
HandlerExecutionChain originalChain = ( HandlerExecutionChain) handler;
this . handler = originalChain. getHandler ( ) ;
this . interceptorList = new ArrayList < > ( ) ;
CollectionUtils. mergeArrayIntoCollection ( originalChain. getInterceptors ( ) , this . interceptorList) ;
CollectionUtils. mergeArrayIntoCollection ( interceptors, this . interceptorList) ;
}
else {
this . handler = handler;
this . interceptors = interceptors;
}
}
public void addInterceptor ( HandlerInterceptor interceptor) {
initInterceptorList ( ) . add ( interceptor) ;
}
public HandlerInterceptor[ ] getInterceptors ( ) {
if ( this . interceptors == null && this . interceptorList != null) {
this . interceptors = this . interceptorList. toArray ( new HandlerInterceptor [ this . interceptorList. size ( ) ] ) ;
}
return this . interceptors;
}
boolean applyPreHandle ( HttpServletRequest request, HttpServletResponse response) throws Exception {
HandlerInterceptor[ ] interceptors = getInterceptors ( ) ;
if ( ! ObjectUtils. isEmpty ( interceptors) ) {
for ( int i = 0 ; i < interceptors. length; i++ ) {
HandlerInterceptor interceptor = interceptors[ i] ;
if ( ! interceptor. preHandle ( request, response, this . handler) ) {
triggerAfterCompletion ( request, response, null) ;
return false ;
}
this . interceptorIndex = i;
}
}
return true ;
}
void applyPostHandle ( HttpServletRequest request, HttpServletResponse response, @Nullable ModelAndView mv) throws Exception {
HandlerInterceptor[ ] interceptors = getInterceptors ( ) ;
if ( ! ObjectUtils. isEmpty ( interceptors) ) {
for ( int i = interceptors. length - 1 ; i >= 0 ; i-- ) {
HandlerInterceptor interceptor = interceptors[ i] ;
interceptor. postHandle ( request, response, this . handler, mv) ;
}
}
}
void triggerAfterCompletion ( HttpServletRequest request, HttpServletResponse response, @Nullable Exception ex) throws Exception {
HandlerInterceptor[ ] interceptors = getInterceptors ( ) ;
if ( ! ObjectUtils. isEmpty ( interceptors) ) {
for ( int i = this . interceptorIndex; i >= 0 ; i-- ) {
HandlerInterceptor interceptor = interceptors[ i] ;
try {
interceptor. afterCompletion ( request, response, this . handler, ex) ;
}
catch ( Throwable ex2) {
logger. error ( "HandlerInterceptor.afterCompletion threw exception" , ex2) ;
}
}
}
}
void applyAfterConcurrentHandlingStarted ( HttpServletRequest request, HttpServletResponse response) {
HandlerInterceptor[ ] interceptors = getInterceptors ( ) ;
if ( ! ObjectUtils. isEmpty ( interceptors) ) {
for ( int i = interceptors. length - 1 ; i >= 0 ; i-- ) {
if ( interceptors[ i] instanceof AsyncHandlerInterceptor ) {
try {
AsyncHandlerInterceptor asyncInterceptor = ( AsyncHandlerInterceptor) interceptors[ i] ;
asyncInterceptor. afterConcurrentHandlingStarted ( request, response, this . handler) ;
}
catch ( Throwable ex) {
logger. error ( "Interceptor [" + interceptors[ i] + "] failed in afterConcurrentHandlingStarted" , ex) ;
}
}
}
}
}
}
三、HandlerInterceptor
HandlerInterceptor是SpringMvc的处理器拦截器,它定义了三个方法
public interface HandlerInterceptor {
default boolean preHandle ( HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return true ;
}
default void postHandle ( HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable ModelAndView modelAndView) throws Exception {
}
default void afterCompletion ( HttpServletRequest request, HttpServletResponse response, Object handler,
@Nullable Exception ex) throws Exception {
}
}
四、RequestMappingHandlerMapping
RequestMappingHandlerMapping是HandlerMapping的一个核心实现类,关于请求处理器的加载,拦截器的加载以及请求处理器的获取都和RequestMappingHandlerMapping密切相关,在后文中会分析这些流程。
五、小结
HandlerMapping是映射器的顶层接口,根据请求来查询处理对应请求的处理器,查询到返回的是一个处理器执行链 处理器执行链封装了处理器方法和写拦截器,拦截器会有对应的方法在处理器方法的前后调用执行 拦截器的前置方法如果有一个返回false,那么请求就会返回,拦截器的前置后置方法执行顺序是倒序的,比如前置方法是1->2->3,那么后置方法执行就是3->2->1 关于拦截器的扫描加载,Handler处理器的扫描加载,Handler处理器的获取细节在后面的文章中开展