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