摘要:繼承于繼承于,其中系列是將作為來使用的,比如所注釋的方法就是這種。的定義如下這里的其實就是在中注釋的內(nèi)容。系列的創(chuàng)建過程是實現(xiàn)了接口,所以容器會自動調(diào)用其方法,有交給方法完成具體的初始化。
RequestMappingHandlerMapping繼承于RequestMappingInfoHandlerMapping繼承于AbstractHandlerMethodMapping,其中AbstractHandlerMethodMapping系列是將method作為handler來使用的,比如@RequestMapping所注釋的方法就是這種handler。AbstractHandlerMethodMapping里涉及的三個map。
/* java
private final Map
private final MultiValueMap
private final MultiValueMap
*/
handlerMethods:保存著匹配條件(也就是RequestCondition)和Handler Method的對應(yīng)關(guān)系,
urlMap:保存著URL與匹配條件的對應(yīng)關(guān)系,當(dāng)然這里的URL是pattern式的,可以使用通配符,另外,這里的map并不是普通的map,而是MultiValueMap,這是一種一個key對應(yīng)多個值的Map,其實它的value是一個list類型的值。MultiValueMap的定義如下:public interface MultiValueMap
nameMap:這個Map是Spring MVC4新增的,保存著name和HandlerMethod的對應(yīng)關(guān)系,它使用的是MultiValueMap類型的Map,也就是說一個name可以有多個HandlerMethod,這里的name是使用HandlerMethodMappingNamingStrategy策略的實現(xiàn)類從HandlerMethod中解析出來,默認使用RequestMappingInfoHandlerMethodMappingNamingStrategy實現(xiàn)類,解析規(guī)則是:類名里的大寫字母+“#”+方法名
。
AbstractHandlerMethodMapping系列的創(chuàng)建過程是:AbstractHandlerMethodMapping實現(xiàn)了InitializingBean接口,所以Spring容器會自動調(diào)用其afterPropertiesSet方法,afterPropertiesSet有交給initHandlerMethods方法完成具體的初始化。
/* Java
protected void initHandlerMethods() {
if (logger.isDebugEnabled()) { logger.debug("Looking for request mappings in application context: " + getApplicationContext()); } String[] beanNames = (this.detectHandlerMethodsInAncestorContexts ? BeanFactoryUtils.beanNamesForTypeIncludingAncestors(obtainApplicationContext(), Object.class) : obtainApplicationContext().getBeanNamesForType(Object.class)); for (String beanName : beanNames) { if (!beanName.startsWith(SCOPED_TARGET_NAME_PREFIX)) { Class> beanType = null; try { beanType = obtainApplicationContext().getType(beanName); } catch (Throwable ex) { // An unresolvable bean type, probably from a lazy bean - let"s ignore it. if (logger.isDebugEnabled()) { logger.debug("Could not resolve target class for bean with name "" + beanName + """, ex); } } if (beanType != null && isHandler(beanType)) { detectHandlerMethods(beanName); } } } handlerMethodsInitialized(getHandlerMethods()); }
*/
首先拿到容器里所有的bean,然后跟住一定的規(guī)則篩選出來Handler,然后保存在map里,具體的篩選是在子類里,篩選的邏輯是檢查類前是否有@Controller或者@RequestMapping注解。
緊接著,在detectHandlerMethods負責(zé)將Handler保存在Map里,detectHandlerMethods方法分兩步走:首先從傳入的處理器中找到符合要求的方法,然后用registerHandlerMethod進行注冊(也就是保存在Map中),從這里可以看出Spring其實是將處理請求的方法所在的類看作處理器,而不是處理請求的方法,不過許多地方需要將請求的方法作為處理器來理解。從handler里獲取可以處理請求的method的方法使用了HandlerMethodSelector.selectMethods,這個方法可以遍歷傳入的handler的所有方法,然后根據(jù)第二個MethodFilter類型的參數(shù)篩選出來合適的方法,這里的MethodFilter使用了匿名類,具體的判斷邏輯是通過在匿名類里調(diào)用getMappingForMethod方法獲取Method的匹配條件,如果可以獲取,則認為是符合要求的,否則不符合要求,getMappingForMethod是模版方法,具體實現(xiàn)在RequestMappingHandlerMapping里,它是根據(jù)@RequestMapping注解來【匹配條件的,如果沒有@RequestMapping注解則返回null,如果有,則根據(jù)注解的內(nèi)容來創(chuàng)建RequestMappingInfo類型的匹配條件并返回。最后通過registerHandlerMethod的方法,注冊到map中,在該方法中,首先檢查一下handlerMethods這個map里是否已經(jīng)有這個匹配條件了,如果有而且所對應(yīng)的值和現(xiàn)在傳入的handlerMethod不是同一個則拋出異常,否者依次添加到三個map里,再往nameMap里添加的時候需要現(xiàn)解析出name然后調(diào)用updateNameMap方法進行添加,通過put方法,進行覆蓋式添加。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/72594.html
摘要:概述上一節(jié)我們分析了的初始化過程,即創(chuàng)建并注冊,本章我們分析下的請求處理過程,即查找。本系列文章是基于。最后創(chuàng)建了群方便大家交流,可掃描加入,同時也可加我,共同學(xué)習(xí)共同進步,謝謝 概述 上一節(jié)我們分析了RequestMappingHandlerMapping的初始化過程,即創(chuàng)建并注冊HandlerMehtod,本章我們分析下RequestMappingHandlerMapping的請求...
摘要:它的作用是根據(jù)找到相應(yīng)的處理器和接口里面只有一個方法只要使用就會返回一個,當(dāng)然我們可以定義自己的實現(xiàn)類來實現(xiàn)。 HandlerMapping:它的作用是根據(jù)request找到相應(yīng)的處理器handler和interceptors,HandlerMapping接口里面只有一個方法HandlerExecutionChain getHandler(HttpServletRequest req...
摘要:定義了一個變量,將所有的和的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,創(chuàng)建時通過重寫調(diào)用方法完成的注冊,內(nèi)部又調(diào)用父類的方法將我們注冊的的注冊到之中。 SimpleUrlHandlerMapping定義了一個map變量,將所有的URL和handler的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,SimpleUrlHandlerMapping創(chuàng)建時通過重寫initApplicationConte...
摘要:默認支持該策略。以上是對的宏觀分析,下面我們進行內(nèi)部細節(jié)分析。整體流程一通過實現(xiàn)接口,完成攔截器相關(guān)組件的初始化調(diào)用類的方法??偨Y(jié)本文主要分析了的初始化過程,希望對大家有幫助。隨著學(xué)習(xí)的深入,后面有時間在分析下期中涉及的關(guān)鍵,比如等等。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個實現(xiàn)類ReqeustMappingHandlerMapping,該類是我們?nèi)粘i_發(fā)中使用最多的...
摘要:系列都是繼承于,它是通過來進行匹配的,是將與對應(yīng)的保存在一個中,在方法中使用從中獲取,中實現(xiàn)了具體用從中獲取的過程,而將的初始化則交給了具體的子類去完成。這里的就是定義在中的,另外還單獨定義了處理請求的處理器。 AbstractUrlHandlerMapping系列都是繼承于AbstractUrlHandlerMapping,它是通過URL來進行匹配的,是將URL與對應(yīng)的handler...
閱讀 3026·2021-11-12 10:36
閱讀 4756·2021-09-22 10:57
閱讀 1570·2021-09-22 10:53
閱讀 2658·2019-08-30 15:55
閱讀 3499·2019-08-29 17:00
閱讀 3356·2019-08-29 16:36
閱讀 2470·2019-08-29 13:46
閱讀 1351·2019-08-26 11:45