AbstractHandlerMapping 的三個interceptor集合

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了,哎發展的很快!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章