Interceptor有三个类型的List:算法
AbstractHandlerMapping的建立其实就是初始化这三个interceptorapp
private final List<Object> interceptors = new ArrayList<Object>(); private final List<HandlerInterceptor> adaptedInterceptors = new ArrayList<HandlerInterceptor>(); private final List<MappedInterceptor> mappedInterceptors = new ArrayList<MappedInterceptor>();
AbstractHandlerMapping初始化会自动调用initApplicationContext。ide
@Override protected void initApplicationContext() throws BeansException { //模板方法,用于给子类提供一个添加Interceptors的入口。 extendInterceptors(this.interceptors); //将SpringMvc容器和父容器中全部的MappedInterceptor类型的Bean添加到mappedInterceptors的属性 detectMappedInterceptors(this.mappedInterceptors); //用于初始化Interceptor,将Interceptors属性里所包含的对象按类型添加到mappedInterceptors和adaptedInterceptors. initInterceptors(); }
HandlerMapping是经过getHandler方法来获取处理器Handler和拦截器Interceptors的。下面看下AbstractHandlerMapping的实现。学习
@Override public final HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception { //一、经过getHandlerInternal方法获取,这是个模板方法。 Object handler = getHandlerInternal(request); if (handler == null) { //二、若是没有获取到则使用默认的Handler handler = getDefaultHandler(); } if (handler == null) { return null; } //三、若是是String类型,则以它为名到SpringMvc的容器里查找相应的Bean。 if (handler instanceof String) { String handlerName = (String) handler; handler = getApplicationContext().getBean(handlerName); } return getHandlerExecutionChain(handler, request); }
getHandlerExecutionChain以前用于找Handler,以后用于添加拦截器。getHandlerExecutionChain的实现使用handler建立出HandlerExecutionChain类型的变量,而后将adaptedInterceptors和符合要求的mappedInterceptors添加进去,最后将其返回。this
protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) { //建立HandlerExecutionChain HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ? (HandlerExecutionChain) handler : new HandlerExecutionChain(handler)); //添加全部AdaptedInterceptor的拦截器 chain.addInterceptors(getAdaptedInterceptors()); String lookupPath = this.urlPathHelper.getLookupPathForRequest(request); //与请求url进行匹配,知足的才加入 for (MappedInterceptor mappedInterceptor : this.mappedInterceptors) { if (mappedInterceptor.matches(lookupPath, this.pathMatcher)) { chain.addInterceptor(mappedInterceptor.getInterceptor()); } } return chain; }
总结:url
AbstractHandlerMapping已经实现了拦截器的初始化,因此子类的主要任务是实现模板方法getHandlerInternal来查找对应的Handler。spa
欢迎加入Java学习交流群点击:484757838
设计