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和我們日常使用關係不大,他只有兩種方式可以配置
- 我們繼承重寫 extendInterceptors(),源碼如下
@Override
protected void initApplicationContext() throws BeansException {
extendInterceptors(this.interceptors);
detectMappedInterceptors(this.mappedInterceptors);
initInterceptors();
}
protected void extendInterceptors(List<Object> interceptors) {
}
這裏提供了一個鉤子,會把interceptors傳給我們,我們這裏有一個機會來在interceptors中間加東西,這樣後面就可以通過上面說的分類操作,來分到其他兩個集合
- 配置的方式,在註冊這個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了,哎發展的很快!