国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

SpringMvc 源碼解讀——AbstractHandlerMethodMapping系列

ninefive / 907人閱讀

摘要:繼承于繼承于,其中系列是將作為來使用的,比如所注釋的方法就是這種。的定義如下這里的其實就是在中注釋的內(nèi)容。系列的創(chuàng)建過程是實現(xiàn)了接口,所以容器會自動調(diào)用其方法,有交給方法完成具體的初始化。

RequestMappingHandlerMapping繼承于RequestMappingInfoHandlerMapping繼承于AbstractHandlerMethodMapping,其中AbstractHandlerMethodMapping系列是將method作為handler來使用的,比如@RequestMapping所注釋的方法就是這種handler。AbstractHandlerMethodMapping里涉及的三個map。

/* java
private final Map handlerMethods = new LinkedHashMap();
private final MultiValueMap urlMap = new LinkedMultiValueMap();
private final MultiValueMap nameMap = new LinkedMultiValueMap();
*/

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 extends Map>,這里的RequestCondition其實就是在@RequestMapping中注釋的內(nèi)容。

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

相關(guān)文章

  • SpringMVC源碼分析--HandlerMapping(六)

    摘要:概述上一節(jié)我們分析了的初始化過程,即創(chuàng)建并注冊,本章我們分析下的請求處理過程,即查找。本系列文章是基于。最后創(chuàng)建了群方便大家交流,可掃描加入,同時也可加我,共同學(xué)習(xí)共同進步,謝謝 概述 上一節(jié)我們分析了RequestMappingHandlerMapping的初始化過程,即創(chuàng)建并注冊HandlerMehtod,本章我們分析下RequestMappingHandlerMapping的請求...

    BDEEFE 評論0 收藏0
  • springMvc源碼解讀--HandlerMapping

    摘要:它的作用是根據(jù)找到相應(yīng)的處理器和接口里面只有一個方法只要使用就會返回一個,當(dāng)然我們可以定義自己的實現(xiàn)類來實現(xiàn)。 HandlerMapping:它的作用是根據(jù)request找到相應(yīng)的處理器handler和interceptors,HandlerMapping接口里面只有一個方法HandlerExecutionChain getHandler(HttpServletRequest req...

    VishKozus 評論0 收藏0
  • SpringMvc源碼解讀--AbstractUrlHandlerMapping系列

    摘要:定義了一個變量,將所有的和的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,創(chuàng)建時通過重寫調(diào)用方法完成的注冊,內(nèi)部又調(diào)用父類的方法將我們注冊的的注冊到之中。 SimpleUrlHandlerMapping定義了一個map變量,將所有的URL和handler的對應(yīng)關(guān)系放在里面,最后注冊在父類里面,SimpleUrlHandlerMapping創(chuàng)建時通過重寫initApplicationConte...

    mj 評論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(四)

    摘要:默認支持該策略。以上是對的宏觀分析,下面我們進行內(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ā)中使用最多的...

    imccl 評論0 收藏0
  • springMvc源碼解讀--AbstractUrlHandlerMapping

    摘要:系列都是繼承于,它是通過來進行匹配的,是將與對應(yīng)的保存在一個中,在方法中使用從中獲取,中實現(xiàn)了具體用從中獲取的過程,而將的初始化則交給了具體的子類去完成。這里的就是定義在中的,另外還單獨定義了處理請求的處理器。 AbstractUrlHandlerMapping系列都是繼承于AbstractUrlHandlerMapping,它是通過URL來進行匹配的,是將URL與對應(yīng)的handler...

    dendoink 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<