HandlerMapping家族成員分為兩支瓢宦,一支繼承AbstractUrlHandlerMapping碎连,另一支繼承AbstractHandlerMethodMapping,而這兩都繼承自抽象類AbstractHandlerMapping.
AbstractHandlerMapping
HandlerMapping的作用是根據(jù)request查找Handler和Interceptors,獲取Handler的過程通過模板方法getHandlerInternal交給子類刁笙。AbstractHandlerMapping中保存了所有配置的Interceptor破花,在獲取到Handler后會根據(jù)從request提取lookpath將相應(yīng)的Interceptors裝配上去,當(dāng)然子類也可以通過getHandlerInternal方法設(shè)置自己的Interceptor疲吸,gethandlerInternal的返回值類型為Object類型座每。
AbstractHandlerMapping繼承了WebApplicationObjectSupport,初始化時會自動調(diào)用模板方法initApplicationContext摘悴,AbstractHandlerMapping的創(chuàng)建就是在initApplicationContext方法實現(xiàn)的峭梳。
1.extendInterceptor是模板方法,用于子類提供一個修改Interceptors的入口蹂喻。
2.detectMappedInterceptors方法用于將Spring MVC容器及父容器中的所有MappedInterceptor類型的Bean添加到mappedInterceptors屬性葱椭。
3.initInterceptors方法的作用是初始化Interceptor,將interceptors屬性所包含的對象按類型添加到mappedInterceptors或者adaptedInterceptors.
HandlerMapping是通過getHandler方法來獲取處理器Handler和攔截器Interceptor的口四。
找到Handler的過程是這樣的:
1.通過getHandlerInternal(request)方法獲取孵运,這個模板方法,留給子類具體實現(xiàn)蔓彩。
2.如果沒有獲取到則使用默認(rèn)的Handler治笨,默認(rèn)的Handler保存在AbstractHandlerMapping的一個Object類型的屬性defaultHandler中,可以在配置HandlerMapping時進(jìn)行配置赤嚼,也可以在子類中進(jìn)行設(shè)置旷赖。
3.如果找到的Handler是String類型,則以它為名到spring MVC的容器里查找相應(yīng)的Bean.
AbstractUrlHandlerMapping
此系列的原理是將url與對應(yīng)的Handler保存在一個Map中更卒,在getHandlerInternal方法中使用url從Map中獲取Handler,AbstractUrlHandlerMapping中實現(xiàn)具體用url從Map中獲取Handler的過程等孵,而Map的初始化則交給具體的子孫類去完成。這里的Map就是定義在AbstractUrlHandlerMapping中HashMap..
AbstractHandlerMethodMapping
將method作為Handler來使用的蹂空。