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

資訊專欄INFORMATION COLUMN

SpringMVC之源碼分析--HandlerMapping(一)

ralap / 3407人閱讀

摘要:接口接口作用是將請求映射到處理程序,以及預(yù)處理和處理后的攔截器列表,映射是基于一些標(biāo)準(zhǔn)的,其中的細(xì)節(jié)因不同的實(shí)現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或?yàn)榈模J(rèn)為,即從上下文中檢查所有的。

概述

在Spring MVC啟動章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRefresh方法調(diào)用initStrategies方法,初始Spring MVC九大策略解析器,本章在此基礎(chǔ)上分析初始化HandlerMapping組件過程,本系列文章是基于Spring5.0.5RELEASE。

接口

HandlerMapping接口作用是將請求映射到處理程序,以及預(yù)處理和處理后的攔截器列表,映射是基于一些標(biāo)準(zhǔn)的,其中的細(xì)節(jié)因不同的實(shí)現(xiàn)而不相同。這是官方文檔上一段描述,該接口只有一個方法getHandler(request),返回一個HandlerExecutionChain對象,接口本身很簡單,源碼如下:

public interface HandlerMapping {

    省略屬性...

    // 返回請求的一個處理程序handler和攔截器interceptors
    @Nullable
    HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
初始化

初始化HandlerMapping的入口方法是DispatcherServlet的initHandlerMappings(ApplicationContext context)方法,該方法源碼如下:

private void initHandlerMappings(ApplicationContext context) {
    this.handlerMappings = null;
    // detectAllHandlerMappings默認(rèn)為true,可通過DispatcherServlet的init-param參數(shù)進(jìn)行設(shè)置
    if (this.detectAllHandlerMappings) {
        // 在ApplicationContext中找到所有的handlerMapping,包括父上下文。
        Map matchingBeans =
                BeanFactoryUtils.beansOfTypeIncludingAncestors(context, HandlerMapping.class, true, false);
        if (!matchingBeans.isEmpty()) {
            this.handlerMappings = new ArrayList<>(matchingBeans.values());
            // 對handlerMapping排序,可通過指定order屬性進(jìn)行設(shè)置,order的值為int型,數(shù)越小優(yōu)先級越高
            AnnotationAwareOrderComparator.sort(this.handlerMappings);
        }
    }
    // detectAllHandlerMappings=false時
    else { 
        try {
            // 從ApplicationContext上下文中取id(或name)="handlerMapping"的bean
            HandlerMapping hm = context.getBean(HANDLER_MAPPING_BEAN_NAME, HandlerMapping.class);
            // 將hm轉(zhuǎn)換成list,并賦值給屬性handlerMappings
            this.handlerMappings = Collections.singletonList(hm);
        }
        catch (NoSuchBeanDefinitionException ex) {
            // Ignore, we"ll add a default HandlerMapping later.
        }
    }

    // 從context上下文中定義HandlerMapping時,Spring MVC將使用默認(rèn)HandlerMapping,默認(rèn)的HandlerMapping在DispatcherServlet.properties屬性文件中定義,
    // 該文件是在DispatcherServlet的static靜態(tài)代碼塊中加載的
    // 默認(rèn)的是:BeanNameUrlHandlerMapping和RequestMappingHandlerMapping
    if (this.handlerMappings == null) {
        this.handlerMappings = getDefaultStrategies(context, HandlerMapping.class);
        if (logger.isDebugEnabled()) {
            logger.debug("No HandlerMappings found in servlet "" + getServletName() + "": using default");
        }
    }
}

至此,我們基本分析了HandlerMapping的初始化過程,接下來針對分析中提到的點(diǎn)進(jìn)行驗(yàn)證,以檢驗(yàn)我們的分析是正確的。

實(shí)戰(zhàn)

項(xiàng)目結(jié)構(gòu)

代碼分析

pom配置文件

引入Spring MVC支持,代碼如下:


    org.springframework
    spring-webmvc
    5.0.5.RELEASE

spring配置文件

spring-servlet.xml是Spring MVC的配置文件,在驗(yàn)證過程中會修改此文件內(nèi)容,內(nèi)容根據(jù)驗(yàn)證目的會有改變,具體參見驗(yàn)證場景的配置。

web配置文件

web.xml是部署描述文件,主要配置了Spring MVC的DispatcherServlet,代碼如下:


    
    dispatcher
    
    org.springframework.web.servlet.DispatcherServlet
    
    
        contextConfigLocation
        classpath:spring-servlet.xml
    
    
    1
    true



    
    dispatcher
    
    /

Controller控制器

本例使用的是SimpleUrlHandlerMapping映射處理器,所以我們的Controller會繼承org.springframework.web.servlet.mvc.Controller類,并實(shí)現(xiàn)handlerRequest方法,代碼如下:

public class DemoController implements Controller{

    @Nullable
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        request.getServletContext().log("進(jìn)入Controller(Handler)處理器。。。");
        return null;
    }
}

驗(yàn)證

默認(rèn)映射處理器

在我們沒有對HandlerMapping進(jìn)行配置時,Spring會使用默認(rèn)的HandlerMapping策略,此時我們的Spring配置文件(spring-servlet.xml)沒有任何內(nèi)容,此時我們啟動應(yīng)用,通過斷點(diǎn)方式驗(yàn)證,結(jié)果如下:

Spring MVC默認(rèn)配置為:

從結(jié)果可知,在未進(jìn)行任何配置HandlerMapping時,系統(tǒng)使用(支持)默認(rèn)的BeanNameUrlHandlerMapping和RequestMappingHandlerMapping映射解析器。

detectAllHandlerMappings

該參數(shù)是boolean類型,作用是檢查所有的HandlerMappings映射解析器或使用id或name為"handlerMappping"的bean,默認(rèn)為true,即從context上下文中檢查所有的HandlerMapping。

我們先通過修改此參數(shù)為false,即在web.xml配置DispatcherServlet時,設(shè)置init-param參數(shù),代碼如下:



    detectAllHandlerMappings
    false

在Spring配置文件spring-servlet.xml中定義映射處理器,以SimpleUrlHandlerMapping為例,代碼如下:



    
        
            demoController
        
    
    
    



打上斷點(diǎn),以debug模式啟動服務(wù),結(jié)果如下:

從結(jié)果可知,Spring取到了我們配置的HandlerMapping(SimpleUrlHandlerMapping)并轉(zhuǎn)換為List賦值給屬性參數(shù)handlerMappings。

加載所有映射處理器

此場景需要我們配置多個映射處理器,Spring配置文件代碼如下:


    
        
            demoController
        
    
    



    

注意將web.xml配置的DispatcherServlet的detectAllHandlerMappings注釋掉或設(shè)置為true

打上斷點(diǎn),以debug模式啟動服務(wù),結(jié)果如下:

從兩種截圖中可知,Spring取出了我們配置的所有的映射解析器,對比兩種圖,可知經(jīng)過排序,Spring實(shí)現(xiàn)了我們指定的解析器的order。

總結(jié)

本小節(jié)分析了HandlerMapping的初始化,過程主要以SimpleUrlHandlerMapping實(shí)現(xiàn)類為例,替換成其他的實(shí)現(xiàn)類,啟動過程也是一樣的,后續(xù)會對實(shí)現(xiàn)類逐個進(jìn)行分析,希望本章對大家能有幫助。

最后創(chuàng)建了qq群方便大家交流,可掃描加入,共同學(xué)習(xí)、共同進(jìn)步,謝謝!

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

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/69396.html

相關(guān)文章

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

    摘要:概述通過前三章的分析,我們簡要分析了和,但對攔截器部分做詳細(xì)的分析,攔截器的加載和初始化是三個相同的部分。 概述 通過前三章的分析,我們簡要分析了SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping和RequestMappingHandlerMapping,但對攔截器部分做詳細(xì)的分析,攔截器的加載和初始化是三個HandlerMapping相...

    nanchen2251 評論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(三)

    摘要:與類圖對比,類繼承自抽象類,其又繼承自抽象類,再往上繼承關(guān)系與一致。創(chuàng)建初始化上一章我們分析了的創(chuàng)建初始化過程,的創(chuàng)建初始化過程與一樣,方法的入口在抽象類中的方法。至此,代碼編寫完畢。 概述 本節(jié)我們繼續(xù)分析HandlerMapping另一個實(shí)現(xiàn)類BeanNameUrlHandlerMapping,從類的名字可知,該類會根據(jù)請求的url與spring容器中定義的bean的name屬性值...

    fsmStudy 評論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(六)

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

    BDEEFE 評論0 收藏0
  • SpringMVC源碼分析--HandlerMapping(二)

    摘要:由于抽象類重寫了父類的方法,所以此時會調(diào)用的方法,在該方法中通過調(diào)用父類的方法,該方法通過模板方法模式最終調(diào)到類的方法。分析該類間接實(shí)現(xiàn)了接口,直接實(shí)現(xiàn)該接口的是抽象類,映射與請求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基礎(chǔ)上繼續(xù)分析,主要完成SimpleUrlHandlerMapping類的原理。 本系列文章是基于Sp...

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

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

    imccl 評論0 收藏0

發(fā)表評論

0條評論

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