摘要:與類圖對比,類繼承自抽象類,其又繼承自抽象類,再往上繼承關系與一致。創(chuàng)建初始化上一章我們分析了的創(chuàng)建初始化過程,的創(chuàng)建初始化過程與一樣,方法的入口在抽象類中的方法。至此,代碼編寫完畢。
概述
本節(jié)我們繼續(xù)分析HandlerMapping另一個實現(xiàn)類BeanNameUrlHandlerMapping,從類的名字可知,該類會根據(jù)請求的url與spring容器中定義的bean的name屬性值進行匹配。
本系列文章是基于Spring5.0.5RELEASE。
類圖類的繼承關系,如下圖:
紅框的類就是我們本章要分析的類。
與SimpleUrlHandlerMapping類圖對比,BeanNameUrlHandlerMapping類繼承自AbstractDetectingUrlHandlerMapping抽象類,其又繼承自AbstractUrlHandlerMapping抽象類,再往上繼承關系與SimpleUrlHandlerMapping一致。
創(chuàng)建/初始化上一章我們分析了SimpleUrlHandlerMapping的創(chuàng)建初始化過程,BeanNameUrlHandlerMapping的創(chuàng)建初始化過程與SimpleUrlHandlerMapping一樣,方法的入口在抽象類AbstractDetectingUrlHandlerMapping中的initApplicationContext()方法。調用原理參考https://segmentfault.com/a/1190000014951551
分析AbstractDetectingUrlHandlerMapping
通過在應用程序上下文中對所有已定義的bean,檢測handler與URL的映射。主要代碼如下:
// 初始化容器上下文時調用 @Override public void initApplicationContext() throws ApplicationContextException { // 調用父類AbstractHandlerMapping初始化攔截器,與SimpleUrlHandlerMapping一樣 super.initApplicationContext(); // 處理url和bean name,具體注冊調用父類AbstractUrlHandlerMapping類完成 detectHandlers(); } protected void detectHandlers() throws BeansException { // 獲取應用上下文 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) { // 通過模板方法模式調用BeanNameUrlHandlerMapping子類處理 String[] urls = determineUrlsForHandler(beanName); if (!ObjectUtils.isEmpty(urls)) { // 調用父類AbstractUrlHandlerMapping將url與handler存入map registerHandler(urls, beanName); } else { if (logger.isDebugEnabled()) { logger.debug("Rejected bean name "" + beanName + "": no URL paths identified"); } } } }
BeanNameUrlHandlerMapping
實現(xiàn)HandlerMapping接口,將url與handler bean進行映射,bean的name屬性需以"/"開頭,源碼如下:
@Override protected String[] determineUrlsForHandler(String beanName) { List實戰(zhàn)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); }
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("進入Controller(Handler)處理器。。。" + this); return null; } }
至此,代碼編寫完畢。
測試啟動程序,訪問地址http://localhost:8087/demo,在控制臺看到日志信息,說明驗證成功。如下圖:
總結本文分析了BeanNameUrlHandlerMapping類,如果看過上篇文章就發(fā)現(xiàn),SimpleUrlHandlerMapping與BeanNameUrlHandlerMapping都實現(xiàn)HandlerMapping接口,即處理url與handler的映射,只是處理的策略不同而已。
BeanNameUrlHanderlMapping有如下不足:
處理器bean的id/name為一個url請求路徑,前面有"/",怪怪的;
如果多個url映射同一個處理器bean,那么就需要定義多個bean,導致容器創(chuàng)建多個處理器實例,占用內存空間;
處理器bean定義與url請求耦合在一起。
最后創(chuàng)建了qq群方便大家交流,可掃描加入,同時也可加我qq:276420284,共同學習、共同進步,謝謝!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69460.html
摘要:接口接口作用是將請求映射到處理程序,以及預處理和處理后的攔截器列表,映射是基于一些標準的,其中的細節(jié)因不同的實現(xiàn)而不相同。該參數(shù)是類型,作用是檢查所有的映射解析器或使用或為的,默認為,即從上下文中檢查所有的。 概述 在Spring MVC啟動章節(jié)https://segmentfault.com/a/1190000014674239,介紹到了DispatcherServlet的onRef...
摘要:概述通過前三章的分析,我們簡要分析了和,但對攔截器部分做詳細的分析,攔截器的加載和初始化是三個相同的部分。 概述 通過前三章的分析,我們簡要分析了SimpleUrlHandlerMapping、BeanNameUrlHandlerMapping和RequestMappingHandlerMapping,但對攔截器部分做詳細的分析,攔截器的加載和初始化是三個HandlerMapping相...
摘要:概述上一節(jié)我們分析了的初始化過程,即創(chuàng)建并注冊,本章我們分析下的請求處理過程,即查找。本系列文章是基于。最后創(chuàng)建了群方便大家交流,可掃描加入,同時也可加我,共同學習共同進步,謝謝 概述 上一節(jié)我們分析了RequestMappingHandlerMapping的初始化過程,即創(chuàng)建并注冊HandlerMehtod,本章我們分析下RequestMappingHandlerMapping的請求...
摘要:由于抽象類重寫了父類的方法,所以此時會調用的方法,在該方法中通過調用父類的方法,該方法通過模板方法模式最終調到類的方法。分析該類間接實現(xiàn)了接口,直接實現(xiàn)該接口的是抽象類,映射與請求。 概述 在前一章https://segmentfault.com/a/1190000014901736的基礎上繼續(xù)分析,主要完成SimpleUrlHandlerMapping類的原理。 本系列文章是基于Sp...
摘要:概述回顧上兩章,我們主要分析了的概念作業(yè)以及如何使用的組件,本節(jié)以及后續(xù)幾章,將介紹為我們提供的的具體實現(xiàn)類,基于源碼和設計層面進行介紹,歡迎大家關注。本系列文章是基于。 概述 回顧上兩章,我們主要分析了HandlerAdapter的概念、作業(yè)以及Spring MVC如何使用的HandlerAdapter組件,本節(jié)以及后續(xù)幾章,將介紹Spring為我們提供的HandlerAdapter...
閱讀 3323·2021-11-25 09:43
閱讀 3008·2021-10-15 09:43
閱讀 1965·2021-09-08 09:36
閱讀 2918·2019-08-30 15:56
閱讀 742·2019-08-30 15:54
閱讀 2684·2019-08-30 15:54
閱讀 2973·2019-08-30 11:26
閱讀 1237·2019-08-29 17:27