欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

SpringMVC中DispatcherServlet的HandlerMapping詳解

 更新時間:2023年10月12日 08:51:10   作者:Evan_L  
這篇文章主要介紹了SpringMVC中DispatcherServlet的HandlerMapping詳解,上回說的Handler,我們說是處理特定請求的,也就是說,不是所有的請求都能處理,那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢,需要的朋友可以參考下

HandlerMapping

上回說的Handler,我們說是處理特定請求的。也就是說,不是所有的請求都能處理。那么問題來了,我們怎知道哪個請求是由哪個Handler處理的呢?

噔噔當(dāng),有請HandlerMapping閃亮登場。HandlerMapping就是處理uri到handler的映射的。從這個角度看他與Map有幾分相似,都是key-value。

然鵝,并不一樣!Spring的命名,你不得不服,就這點(diǎn)也給你整的明明白白。他是Handler+Mapping。

是映射Handler沒錯,但不是Map。我們的Handler可以處理特定的請求沒錯,但沒說只能處理一個特定請求啊。也可能是一個類似的patern的一系列路徑。

先看看定義:

public interface HandlerMapping {
	/**
	 * 獲取Handler
	 */
	@Nullable
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
public interface MatchableHandlerMapping extends HandlerMapping {
	/**
	 * 匹配請求路徑
	 */
	@Nullable
	RequestMatchResult match(HttpServletRequest request, String pattern);
}

我們可以發(fā)現(xiàn),他有兩個接口,其中MatchableHandlerMapping是HandlerMapping的派生接口。多了請求匹配接口方法。

這里介紹以下他的三個重要實(shí)現(xiàn):

實(shí)現(xiàn)介紹
SimpleUrlHandlerMapping用于簡單映射URL到Handler。主要提供給客戶定制使用的,因此不會自動配置
BeanNameUrlHandlerMapping如果Handler的beanName帶“/”的,就是由他來進(jìn)行映射的。他會自動掃描容器中的beanName來識別handler,自動建立映射關(guān)系。在沒有配置HandlerMapping的情況下,會自動配置。
RequestMappingHandlerMapping看名字就知道,他是為了@RequestMapping進(jìn)行映射的。在沒有配置HandlerMapping的情況下,會自動配置

在這里插入圖片描述

PS:社區(qū)版只能這樣看class diagrams了,勉強(qiáng)看吧。旗艦版的氪金大佬可以右鍵看氪金版的。 言歸正傳,SimpleUrlHandlerMapping特別簡單,只要告訴他哪個請求由哪個handler處理就行??梢哉{(diào)用他的setMapping(Properties mapping)方法,或者是setUrlMap。前者會被轉(zhuǎn)成Map給屬性urlMap賦值,而后者則是直接對urlMap賦值。

從繼承關(guān)系看,他繼承于AbstractUrlHandlerMapping。 AbstractUrlHandlerMapping實(shí)現(xiàn)了一系列基于url實(shí)現(xiàn)的HandlerMapping通用功能。

主要體現(xiàn)在,他通過ApplicationContextAware接口獲取到ApplicationContext,并且在該方法中獲取handler的beanName并轉(zhuǎn)換為實(shí)際handler對象。

并注冊到 org.springframework.web.reactive.handler.AbstractUrlHandlerMapping#handlerMap

得,到這里,應(yīng)該知道,我們是在什么時候建立起URL跟Handler的關(guān)系了吧。

BeanNameUrlHandlerMapping

相較于SimpleUrlHandlerMapping,BeanNameUrlHandlerMapping則完全不需要用戶自己定義url到handler的關(guān)系。,而是自動檢測發(fā)現(xiàn)。前提是,你的handler在定義的時候beanName以“/”開頭。而關(guān)于他的秘密也同樣在他的繼承關(guān)系圖里:

在這里插入圖片描述

與SimpleUrlHandlerMapping類似,他也是基于ApplicationContextAware接口進(jìn)行擴(kuò)展而來的能力。

在獲得上下文后,通過上下文遍歷所有的beanName,就能知道這個bean是不是一個handler了。

封裝HandlerExecutionChain

此時,必須提醒一下大家,HandlerMapping接口的返回值是HandlerExecutionChain,并不是Handler。前面不管是說哪個HandlerMapping,都只是在說怎么尋找Handler、以及怎么注冊??蓻]有說HandlerExecutionChain。其實(shí),這得益于他們公共的父類方法 org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandler 。這也意味著,封裝HandlerExecutionChain是在每個請求進(jìn)來的時候才封裝的。具體代碼:

protected HandlerExecutionChain getHandlerExecutionChain(Object handler, HttpServletRequest request) {
		HandlerExecutionChain chain = (handler instanceof HandlerExecutionChain ?
				(HandlerExecutionChain) handler : new HandlerExecutionChain(handler));
		for (HandlerInterceptor interceptor : this.adaptedInterceptors) {
			if (interceptor instanceof MappedInterceptor) {
				MappedInterceptor mappedInterceptor = (MappedInterceptor) interceptor;
				if (mappedInterceptor.matches(request)) {
					chain.addInterceptor(mappedInterceptor.getInterceptor());
				}
			}
			else {
				chain.addInterceptor(interceptor);
			}
		}
		return chain;
	}

代碼也比較簡單。這里面還讓我們多認(rèn)識了MappedInterceptor,他可以針對特定的請求進(jìn)行攔截。

總結(jié)

上面講的兩款都是基于AbstractUrlHandlerMapping擴(kuò)展出來的HandlerMapping。而AbstractUrlHandlerMapping處理的都是基于URL來處理的,意味著不會有其他的可以匹配的條件。

Handler注冊中心則有兩種。

Handler注冊方式Handler注冊中心
基于URL 注冊Map<String, Object> handlerMap = new LinkedHashMap<>();
基于pattern注冊的Map<PathPattern, Object> pathPatternHandlerMap = new LinkedHashMap<>();

但都是簡單Map就能搞定。

  • HandlerMapping的作用是尋找匹配的Handler,與Handler的類型無關(guān),不存在一一對應(yīng)關(guān)系。
  • 封裝HandlerExecutionChain是在獲取Handler時,在公共父類AbstractHandlerMapping里實(shí)現(xiàn)的。

到此這篇關(guān)于SpringMVC中DispatcherServlet的HandlerMapping詳解的文章就介紹到這了,更多相關(guān)HandlerMapping詳解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java SPEL表達(dá)式注入漏洞原理解析

    Java SPEL表達(dá)式注入漏洞原理解析

    SpEL簡稱Spring表達(dá)式語言,在Spring 3中引入,SpEL能在運(yùn)行時構(gòu)建復(fù)雜表達(dá)式、存取對象圖屬性、對象方法調(diào)用等等,可以與基于XML和基于注解的Spring配置還有bean定義一起使用,本文給大家介紹Java SPEL表達(dá)式注入漏洞原理研究,感興趣的朋友一起看看吧
    2023-10-10
  • SpringBoot集成kafka全面實(shí)戰(zhàn)記錄

    SpringBoot集成kafka全面實(shí)戰(zhàn)記錄

    在實(shí)際開發(fā)中,我們可能有這樣的需求,應(yīng)用A從TopicA獲取到消息,經(jīng)過處理后轉(zhuǎn)發(fā)到TopicB,再由應(yīng)用B監(jiān)聽處理消息,即一個應(yīng)用處理完成后將該消息轉(zhuǎn)發(fā)至其他應(yīng)用,完成消息的轉(zhuǎn)發(fā),這篇文章主要介紹了SpringBoot集成kafka全面實(shí)戰(zhàn),需要的朋友可以參考下
    2021-11-11
  • 老生常談foreach(增強(qiáng)for循環(huán))和for的區(qū)別

    老生常談foreach(增強(qiáng)for循環(huán))和for的區(qū)別

    下面小編就為大家?guī)硪黄仙U刦oreach(增強(qiáng)for循環(huán))和for的區(qū)別。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-09-09
  • Java web過濾器驗(yàn)證登錄防止未登錄進(jìn)入界面

    Java web過濾器驗(yàn)證登錄防止未登錄進(jìn)入界面

    這篇文章主要介紹了Java web過濾器驗(yàn)證登錄防止未登錄進(jìn)入界面,在一些系統(tǒng)中經(jīng)??梢杂玫酱斯δ?,對java web 驗(yàn)證登錄知識感興趣的朋友一起看下吧
    2016-08-08
  • SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解

    這篇文章主要介紹了SpringBoot之通過BeanPostProcessor動態(tài)注入ID生成器案例詳解,本篇文章通過簡要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09
  • Java實(shí)現(xiàn)的剪刀石頭布游戲示例

    Java實(shí)現(xiàn)的剪刀石頭布游戲示例

    這篇文章主要介紹了Java實(shí)現(xiàn)的剪刀石頭布游戲,涉及java隨機(jī)數(shù)生成及邏輯判定等相關(guān)操作技巧,需要的朋友可以參考下
    2017-12-12
  • Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

    Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析

    這篇文章主要介紹了Spring Cloud Stream微服務(wù)消息框架原理及實(shí)例解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • Java?回調(diào)callback舉例詳解

    Java?回調(diào)callback舉例詳解

    這篇文章主要介紹了Java?回調(diào)callback舉例詳解,軟件模塊之間總是存在一定的接口,從調(diào)用方式上,可以把他們分為三類:同步調(diào)用、回調(diào)和異步調(diào)用
    2022-09-09
  • 理解Java設(shè)計模式編程中的迪米特原則

    理解Java設(shè)計模式編程中的迪米特原則

    這篇文章主要介紹了Java設(shè)計模式編程中的迪米特原則,迪米特原則旨在降低類與類之間的耦合,需要的朋友可以參考下
    2016-02-02
  • SpringBoot自定義Starter的教程指南

    SpringBoot自定義Starter的教程指南

    SpringBoot的Starter自動配置機(jī)制極大地簡化了依賴管理和應(yīng)用配置,使得開發(fā)者可以以最少的配置快速啟動和運(yùn)行Spring應(yīng)用,有時,標(biāo)準(zhǔn)的Starter可能無法滿足特定需求,需要創(chuàng)建自定義Starter,所以本文給大家介紹了SpringBoot自定義Starter的教程指南
    2024-11-11

最新評論