成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

SpringMvc 源碼解讀——AbstractHandlerMethodMapping系列

ninefive / 955人閱讀

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

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

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

handlerMethods:保存著匹配條件(也就是RequestCondition)和Handler Method的對(duì)應(yīng)關(guān)系,

urlMap:保存著URL與匹配條件的對(duì)應(yīng)關(guān)系,當(dāng)然這里的URL是pattern式的,可以使用通配符,另外,這里的map并不是普通的map,而是MultiValueMap,這是一種一個(gè)key對(duì)應(yīng)多個(gè)值的Map,其實(shí)它的value是一個(gè)list類(lèi)型的值。MultiValueMap的定義如下:public interface MultiValueMap extends Map>,這里的RequestCondition其實(shí)就是在@RequestMapping中注釋的內(nèi)容。

nameMap:這個(gè)Map是Spring MVC4新增的,保存著name和HandlerMethod的對(duì)應(yīng)關(guān)系,它使用的是MultiValueMap類(lèi)型的Map,也就是說(shuō)一個(gè)name可以有多個(gè)HandlerMethod,這里的name是使用HandlerMethodMappingNamingStrategy策略的實(shí)現(xiàn)類(lèi)從HandlerMethod中解析出來(lái),默認(rèn)使用RequestMappingInfoHandlerMethodMappingNamingStrategy實(shí)現(xiàn)類(lèi),解析規(guī)則是:類(lèi)名里的大寫(xiě)字母+“#”+方法名

。

AbstractHandlerMethodMapping系列的創(chuàng)建過(guò)程是:AbstractHandlerMethodMapping實(shí)現(xiàn)了InitializingBean接口,所以Spring容器會(huì)自動(dòng)調(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ī)則篩選出來(lái)Handler,然后保存在map里,具體的篩選是在子類(lèi)里,篩選的邏輯是檢查類(lèi)前是否有@Controller或者@RequestMapping注解。
緊接著,在detectHandlerMethods負(fù)責(zé)將Handler保存在Map里,detectHandlerMethods方法分兩步走:首先從傳入的處理器中找到符合要求的方法,然后用registerHandlerMethod進(jìn)行注冊(cè)(也就是保存在Map中),從這里可以看出Spring其實(shí)是將處理請(qǐng)求的方法所在的類(lèi)看作處理器,而不是處理請(qǐng)求的方法,不過(guò)許多地方需要將請(qǐng)求的方法作為處理器來(lái)理解。從handler里獲取可以處理請(qǐng)求的method的方法使用了HandlerMethodSelector.selectMethods,這個(gè)方法可以遍歷傳入的handler的所有方法,然后根據(jù)第二個(gè)MethodFilter類(lèi)型的參數(shù)篩選出來(lái)合適的方法,這里的MethodFilter使用了匿名類(lèi),具體的判斷邏輯是通過(guò)在匿名類(lèi)里調(diào)用getMappingForMethod方法獲取Method的匹配條件,如果可以獲取,則認(rèn)為是符合要求的,否則不符合要求,getMappingForMethod是模版方法,具體實(shí)現(xiàn)在RequestMappingHandlerMapping里,它是根據(jù)@RequestMapping注解來(lái)【匹配條件的,如果沒(méi)有@RequestMapping注解則返回null,如果有,則根據(jù)注解的內(nèi)容來(lái)創(chuàng)建RequestMappingInfo類(lèi)型的匹配條件并返回。最后通過(guò)registerHandlerMethod的方法,注冊(cè)到map中,在該方法中,首先檢查一下handlerMethods這個(gè)map里是否已經(jīng)有這個(gè)匹配條件了,如果有而且所對(duì)應(yīng)的值和現(xiàn)在傳入的handlerMethod不是同一個(gè)則拋出異常,否者依次添加到三個(gè)map里,再往nameMap里添加的時(shí)候需要現(xiàn)解析出name然后調(diào)用updateNameMap方法進(jìn)行添加,通過(guò)put方法,進(jìn)行覆蓋式添加。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/72594.html

相關(guān)文章

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

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

    BDEEFE 評(píng)論0 收藏0
  • springMvc源碼解讀--HandlerMapping

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

    VishKozus 評(píng)論0 收藏0
  • SpringMvc源碼解讀--AbstractUrlHandlerMapping系列

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

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

    摘要:默認(rèn)支持該策略。以上是對(duì)的宏觀分析,下面我們進(jìn)行內(nèi)部細(xì)節(jié)分析。整體流程一通過(guò)實(shí)現(xiàn)接口,完成攔截器相關(guān)組件的初始化調(diào)用類(lèi)的方法。總結(jié)本文主要分析了的初始化過(guò)程,希望對(duì)大家有幫助。隨著學(xué)習(xí)的深入,后面有時(shí)間在分析下期中涉及的關(guān)鍵,比如等等。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個(gè)實(shí)現(xiàn)類(lèi)ReqeustMappingHandlerMapping,該類(lèi)是我們?nèi)粘i_(kāi)發(fā)中使用最多的...

    imccl 評(píng)論0 收藏0
  • springMvc源碼解讀--AbstractUrlHandlerMapping

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

    dendoink 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

閱讀需要支付1元查看
<