成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

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

fsmStudy / 1881人閱讀

摘要:與類圖對(duì)比,類繼承自抽象類,其又繼承自抽象類,再往上繼承關(guān)系與一致。創(chuàng)建初始化上一章我們分析了的創(chuàng)建初始化過程,的創(chuàng)建初始化過程與一樣,方法的入口在抽象類中的方法。至此,代碼編寫完畢。

概述

本節(jié)我們繼續(xù)分析HandlerMapping另一個(gè)實(shí)現(xiàn)類BeanNameUrlHandlerMapping,從類的名字可知,該類會(huì)根據(jù)請(qǐng)求的url與spring容器中定義的bean的name屬性值進(jìn)行匹配。

本系列文章是基于Spring5.0.5RELEASE。

類圖

類的繼承關(guān)系,如下圖:

紅框的類就是我們本章要分析的類。

與SimpleUrlHandlerMapping類圖對(duì)比,BeanNameUrlHandlerMapping類繼承自AbstractDetectingUrlHandlerMapping抽象類,其又繼承自AbstractUrlHandlerMapping抽象類,再往上繼承關(guān)系與SimpleUrlHandlerMapping一致。

創(chuàng)建/初始化

上一章我們分析了SimpleUrlHandlerMapping的創(chuàng)建初始化過程,BeanNameUrlHandlerMapping的創(chuàng)建初始化過程與SimpleUrlHandlerMapping一樣,方法的入口在抽象類AbstractDetectingUrlHandlerMapping中的initApplicationContext()方法。調(diào)用原理參考https://segmentfault.com/a/1190000014951551

分析

AbstractDetectingUrlHandlerMapping

通過在應(yīng)用程序上下文中對(duì)所有已定義的bean,檢測(cè)handler與URL的映射。主要代碼如下:

// 初始化容器上下文時(shí)調(diào)用
@Override
public void initApplicationContext() throws ApplicationContextException {
    // 調(diào)用父類AbstractHandlerMapping初始化攔截器,與SimpleUrlHandlerMapping一樣
    super.initApplicationContext();
    // 處理url和bean name,具體注冊(cè)調(diào)用父類AbstractUrlHandlerMapping類完成
    detectHandlers();
}

protected void detectHandlers() throws BeansException {
    // 獲取應(yīng)用上下文
    ApplicationContext applicationContext = obtainApplicationContext();
    if (logger.isDebugEnabled()) {
        logger.debug("Looking for URL mappings in application context: " + applicationContext);
    }
    // 獲取上下文中定義的bean
    String[] beanNames = (this.detectHandlersInAncestorContexts ?
            BeanFactoryUtils.beanNamesForTypeIncludingAncestors(applicationContext, Object.class) :
            applicationContext.getBeanNamesForType(Object.class));

    // Take any bean name that we can determine URLs for.
    for (String beanName : beanNames) {
        // 通過模板方法模式調(diào)用BeanNameUrlHandlerMapping子類處理
        String[] urls = determineUrlsForHandler(beanName);
        if (!ObjectUtils.isEmpty(urls)) {
            // 調(diào)用父類AbstractUrlHandlerMapping將url與handler存入map
            registerHandler(urls, beanName);
        }
        else {
            if (logger.isDebugEnabled()) {
                logger.debug("Rejected bean name "" + beanName + "": no URL paths identified");
            }
        }
    }
}

BeanNameUrlHandlerMapping

實(shí)現(xiàn)HandlerMapping接口,將url與handler bean進(jìn)行映射,bean的name屬性需以"/"開頭,源碼如下:

@Override
protected String[] determineUrlsForHandler(String beanName) {
    List urls = new ArrayList<>();
    if (beanName.startsWith("/")) {
        urls.add(beanName);
    }
    String[] aliases = obtainApplicationContext().getAliases(beanName);
    for (String alias : aliases) {
        if (alias.startsWith("/")) {
            urls.add(alias);
        }
    }
    return StringUtils.toStringArray(urls);
}
實(shí)戰(zhàn)

pom文件

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


    org.springframework
    spring-webmvc
    5.0.5.RELEASE


    javax.servlet
    javax.servlet-api
    3.1.0
    provided

spring配置文件

新建spring MVC配置文件,代碼如下:







    




web部署描述文件

配置Spring MVC 前端控制器DispatcherServlet,代碼如下:



    Archetype Created Web Application
    
        
        dispatcher
        
        org.springframework.web.servlet.DispatcherServlet
        
        
            contextConfigLocation
            classpath:spring-servlet.xml
        
        
        
            detectAllHandlerMappings
            false
        
        
        1
        true
    
    
    
        
        dispatcher
        
        /
    

Handler控制器

編寫Controller控制器,代碼如下:

import org.springframework.lang.Nullable;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DemoController implements Controller{

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

        return null;
    }
}

至此,代碼編寫完畢。

測(cè)試

啟動(dòng)程序,訪問地址http://localhost:8087/demo,在控制臺(tái)看到日志信息,說明驗(yàn)證成功。如下圖:

總結(jié)

本文分析了BeanNameUrlHandlerMapping類,如果看過上篇文章就發(fā)現(xiàn),SimpleUrlHandlerMapping與BeanNameUrlHandlerMapping都實(shí)現(xiàn)HandlerMapping接口,即處理url與handler的映射,只是處理的策略不同而已。

BeanNameUrlHanderlMapping有如下不足:

處理器bean的id/name為一個(gè)url請(qǐng)求路徑,前面有"/",怪怪的;

如果多個(gè)url映射同一個(gè)處理器bean,那么就需要定義多個(gè)bean,導(dǎo)致容器創(chuàng)建多個(gè)處理器實(shí)例,占用內(nèi)存空間;

處理器bean定義與url請(qǐng)求耦合在一起。

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

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/69460.html

相關(guān)文章

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

    摘要:接口接口作用是將請(qǐng)求映射到處理程序,以及預(yù)處理和處理后的攔截器列表,映射是基于一些標(biāo)準(zhǔn)的,其中的細(xì)節(jié)因不同的實(shí)現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或?yàn)榈?,默認(rèn)為,即從上下文中檢查所有的。 概述 在Spring MVC啟動(dòng)章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...

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

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

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

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

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

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

    Imfan 評(píng)論0 收藏0
  • SpringMVC源碼分析--HandlerAdapter(

    摘要:概述回顧上兩章,我們主要分析了的概念作業(yè)以及如何使用的組件,本節(jié)以及后續(xù)幾章,將介紹為我們提供的的具體實(shí)現(xiàn)類,基于源碼和設(shè)計(jì)層面進(jìn)行介紹,歡迎大家關(guān)注。本系列文章是基于。 概述 回顧上兩章,我們主要分析了HandlerAdapter的概念、作業(yè)以及Spring MVC如何使用的HandlerAdapter組件,本節(jié)以及后續(xù)幾章,將介紹Spring為我們提供的HandlerAdapter...

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

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

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<