HandlerMapping家族成員分為兩支,一支繼承AbstractUrlHandlerMapping,另一支繼承AbstractHandlerMethodMapping,而這兩都繼承自抽象類AbstractHandlerMapping.
AbstractHandlerMapping
HandlerMapping的作用是根據request查找Handler和Interceptors,獲取Handler的過程通過模板方法getHandlerInternal交給子類。AbstractHandlerMapping中保存了所有配置的Interceptor,在獲取到Handler后會根據從request提取lookpath將相應的Interceptors裝配上去,當然子類也可以通過getHandlerInternal方法設置自己的Interceptor,gethandlerInternal的返回值類型為Object類型。
AbstractHandlerMapping繼承了WebApplicationObjectSupport,初始化時會自動調用模板方法initApplicationContext,AbstractHandlerMapping的創建就是在initApplicationContext方法實現的。
1.extendInterceptor是模板方法,用于子類提供一個修改Interceptors的入口。
2.detectMappedInterceptors方法用于將Spring MVC容器及父容器中的所有MappedInterceptor類型的Bean添加到mappedInterceptors屬性。
3.initInterceptors方法的作用是初始化Interceptor,將interceptors屬性所包含的對象按類型添加到mappedInterceptors或者adaptedInterceptors.
HandlerMapping是通過getHandler方法來獲取處理器Handler和攔截器Interceptor的。
找到Handler的過程是這樣的:
1.通過getHandlerInternal(request)方法獲取,這個模板方法,留給子類具體實現。
2.如果沒有獲取到則使用默認的Handler,默認的Handler保存在AbstractHandlerMapping的一個Object類型的屬性defaultHandler中,可以在配置HandlerMapping時進行配置,也可以在子類中進行設置。
3.如果找到的Handler是String類型,則以它為名到spring MVC的容器里查找相應的Bean.
AbstractUrlHandlerMapping
此系列的原理是將url與對應的Handler保存在一個Map中,在getHandlerInternal方法中使用url從Map中獲取Handler,AbstractUrlHandlerMapping中實現具體用url從Map中獲取Handler的過程,而Map的初始化則交給具體的子孫類去完成。這里的Map就是定義在AbstractUrlHandlerMapping中HashMap..
AbstractHandlerMethodMapping
將method作為Handler來使用的。