欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

AbstractHandlerMapping 的三个interceptor集合

程序员文章站 2022-05-23 10:50:40
...

AbstractHandlerMapping 主要干什么

AbstractHandlerMapping 主要定义写好了创建 HandlerExecutionChain 的需要必要参数,和流程,主要就是怎么找到,整理Interceptors和getHandler()方法,这个文章说的很简单,就是说一说这里有三个interceptor,源码如下

private final List<Object> interceptors = new ArrayList<Object>();

private final List<HandlerInterceptor> adaptedInterceptors = new ArrayList<HandlerInterceptor>();

private final List<MappedInterceptor> mappedInterceptors = new ArrayList<MappedInterceptor>();

List< Object > interceptors

大家注意这逼是object 的类型的,不是interceptor,他是在创建AbstractHandlerMapping零时存一下东西,后面会在 initInterceptors()方法中,遍历它,把他分类到其他两个集合中。源码如下

protected void initInterceptors() {
		if (!this.interceptors.isEmpty()) {
			for (int i = 0; i < this.interceptors.size(); i++) {
				Object interceptor = this.interceptors.get(i);
				if (interceptor == null) {
					throw new IllegalArgumentException("Entry number " + i + " in interceptors array is null");
				}
				if (interceptor instanceof MappedInterceptor) {
					this.mappedInterceptors.add((MappedInterceptor) interceptor);
				}
				else {
					this.adaptedInterceptors.add(adaptInterceptor(interceptor));
				}
			}
		}
	}

注意!我一开始以为是,我们配置的interceptor全部都放到interceptors中,后面发现和interceptors和我们日常使用关系不大,他只有两种方式可以配置

  1. 我们继承重写 extendInterceptors(),源码如下
@Override
	protected void initApplicationContext() throws BeansException {
		extendInterceptors(this.interceptors);
		detectMappedInterceptors(this.mappedInterceptors);
		initInterceptors();
	}

protected void extendInterceptors(List<Object> interceptors) {
	}

这里提供了一个钩子,会把interceptors传给我们,我们这里有一个机会来在interceptors中间加东西,这样后面就可以通过上面说的分类操作,来分到其他两个集合

  1. 配置的方式,在注册这个handlerMapping,同时配置interceptor,这个方法
public void setInterceptors(Object... interceptors) {
		this.interceptors.addAll(Arrays.asList(interceptors));
	}

List

这个现在是直接在每一个handlerMapping中都有一份,会直接被放到HandlerExecutionChain中等待被执行,因为他根本没有判断拦截的条件,都运行

List mappedInterceptors

这个是我们频繁使用的,我们在xml中配置的就是这个东西,这个只要被加载到spingappliactionContext中就会被加载发现到 handlermapping中,原理在上两篇文章中有。

ps; 我发现在spring-webmvc 4.3.5 之后,第3个没有了,直接让 MappedInterceptor继承MappedInterceptor,也就是不存在不带拦截url条件的interceptor了,所有的interceptor都是MappedInterceptor了,哎发展的很快!

相关标签: interceptor