精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

詳解SpringMVC底層原理

原創 精選
開發 前端
筆者的專業是軟件技術,主修Java,記得剛開始寫Web應用的時候,都是直接寫Servlet,有多少個請求服務就寫多少個Servlet,于是一個系統中出現了一堆的Servlet,記得那會JSP也很流行,后來又經歷了Struts1、Struts2,到現在前后端技術分離了,則更多是用SpringMVC。

作者 | 波哥

審校 | 重樓

筆者的專業是軟件技術,主修Java,記得剛開始寫Web應用的時候,都是直接寫Servlet,有多少個請求服務就寫多少個Servlet,于是一個系統中出現了一堆的Servlet,記得那會JSP也很流行,后來又經歷了Struts1、Struts2,到現在前后端技術分離了,則更多是用SpringMVC。

隨著技術的發展,你會發現寫代碼變得越來越簡單,當然這個簡單是建立在前輩大神們深邃的設計思想上的,今天我們就來詳細聊聊SpringMVC,學習SpringMVC底層原理的同時,感受下大神們的設計思想。

我們先來通過一張圖了解下SpringMVC處理請求的整體流程:

使用過SpringMVC的老鐵們都知道,在SpringMVC中最核心的就是DispatcherServlet類,接下來筆者將從DispatcherServlet如何處理請求的整體流程來闡述它的底層實現。

DispatcherServlet毫無疑問是一個HttpServlet,因此可以追蹤到所有的請求都會進入到doDispatch方法中,而這個方法就是咱們要解剖的方法:

該方法主要有幾條主線:獲取HandlerExecutionChain、獲取HandlerAdapter、調用Adapter的handle方法、視圖處理器處理。下面我們將從這幾個主線逐一分析。

一、獲取HandlerExecutionChain

首先說明下這個HandlerExecutionChain,它里面封裝了一堆的Interceptor攔截器,以及Handler,它是一個處理鏈,通過getHandler方法獲取得到:

從代碼中我看到,這里循環handlerMappings,調用HandlerMapping的getHandler方法來獲取HandlerExecutionChain對象,獲取到了就返回,那這個handlerMappings都包含了哪些HandlerMapping呢?它們是什么時候被塞到handlerMappings集合中去的?

在DispatcherServlet的initStrategies方法中,會初始化一堆的數據,其中就有調用initHandlerMappings方法來初始化HandlerMapping,放到handlerMappings集合中,至于initStrategies方法是怎么被調用的,大家看下DispatcherServlet的繼承結構圖,然后根據Servlet的生命周期跟蹤下相信就知道了。

我們來看下initHandlerMappings方法:

從方法中可以看出,從Spring的Bean工廠中獲取HandlerMapping.class類型的Bean,以得到handlerMappings,在實際過程中,和咱們實際應用相關的HandlerMapping主要包括:BeanNameUrlHandlerMapping、SimpleUrlHandlerMapping、
RequestMappingHandlerMapping這三類,當然還有其他。

所以我們就知道了,上面是調用這三個HandlerMapping的getHandler方法來獲取HandlerExecutionChain對象。我們大概猜想,這個getHandler方法是根據請求的URL路徑,來獲取到處理的對象或者方法,這個是順理成章的,因為我們在開發的時候,就是通過配置path路徑來明確請求的路徑和方法或類的對應關系的。

我們先來看它們內部到底存放了什么,以及getHandler方法的具體邏輯,我們主要看BeanNameUrlHandlerMapping和
RequestMappingHandlerMapping。

1.BeanNameUrlHandlerMapping

從它的繼承關系圖中可以看到,它是Aware的實現類,跟蹤它的生命周期,Spring會調用initApplicationContext方法,然后調用detectHandlers方法來找到對應的Handler,并調用registerHandler方法將找到的Handler添加到handlerMap這個Map集合中去。

那上面"對應的Handler"需要滿足什么條件呢?

看上面的判斷邏輯,表明如果bean的名稱是以"/"開頭,則滿足條件,然后從Spring的Bean工廠中獲取到對應的Bean實例,添加到handlerMap集合。

在具體使用時,可以實現Controller和HttpRequestHandler接口,同時Component注解的value值以"/"開頭。

好,數據準備完成,接下來就是getHandler方法:

跟蹤代碼可以看出,就是根據URL從handlerMap獲取到對應的實例,隨后再將handler和HandlerInterceptor封裝成HandlerExecutionChain對象:

2.RequestMappingHandlerMapping

RequestMappingHandlerMapping是InitializingBean的實現類,在bean的初始化階段,它的afterPropertiesSet方法會被Spring調用,跟蹤該方法:

發現獲取所有的bean實例,然后循環調用processCandidateBean方法:

必須滿足一定條件的實例才會被處理,這個條件就是類上面包含Controller或者RequestMapping注解:

對于滿足上述條件的bean,會在detectHandlerMethods方法中將RequestMapping注解中的路徑和對應的方法封裝成HandlerMethod,并添加到mappingLookup集合中。

然后調用getHandler方法,根據請求URL從mappingLookup集合中取出HandlerMethod,并封裝成HandlerExecutionChain對象。

二、獲取HandlerAdapter

在上述調用getHandler方法,獲取到HandlerExecutionChain對象后,接下來調用getHandlerAdapter方法獲取HandlerAdapter:

循環所有的HandlerAdapter,調用supports方法判斷HandlerAdapter是否支持處理Handler。這里有兩個問題:第一、HandlerAdapter有哪些?它們是什么時候被初始化的?第二、每個HandlerAdapter的supports方法的具體實現;

1.HandlerAdapter有哪些?它們是什么時候被添加到handlerAdapters的?

同上,HandlerAdapter的初始化也是在initStrategies方法中發起的,在initHandlerAdapters方法中完成具體的添加:

可以看到,從Spring容器中獲取所有的HandlerAdapter類型的Bean添加到handlerAdapters中,默認情況下包括:
RequestMappingHandlerAdapter、HandlerFunctionAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter四個實現類的Bean實例。

2.HandlerAdapter的supports方法的具體實現

我們這里主要講下
RequestMappingHandlerAdapter、SimpleControllerHandlerAdapter和HttpRequestHandlerAdapter的supports實現邏輯:

  • RequestMappingHandlerAdapter

Handler是HandlerMethod類型,則由RequestMappingHandlerAdapter處理。

  • SimpleControllerHandlerAdapter

如果handler是Controller的實現類,則會由SimpleControllerHandlerAdapter處理。

  • HttpRequestHandlerAdapter

如果handler是HttpRequestHandler的實現類,則會由HttpRequestHandlerAdapter處理。

三、調用HandlerAdapter的handle方法

在獲取到HandlerAdapter后,還會調用interceptor的preHandle方法,這里就不詳細描述了。這里咱們直接看HandlerAdapter的handle方法的具體實現。

1.RequestMappingHandlerAdapter

相對于其他Adapter的處理方法,RequestMappingHandlerAdapter要復雜的的多。

顯示創建ServletInvocableHandlerMethod對象,然后往對象中添加HandlerMethodArgumentResolvers和HandlerMethodReturnValueHandlers,這兩個接口很重要,是SpringMVC的兩個重要擴展點。

隨后開始處理,總結來說主要做了兩件事:

獲取方法參數值,然后調用方法:

執行方法相對簡單,咱們主要來看看是如何獲取方法參數值的:

先獲取到方法上的所有參數信息MethodParameter,然后調用
resolvers.supportsParameter方法來判斷是否支持對參數類型進行轉換,那這個resolvers是啥?它是一個HandlerMethodArgumentResolver,里面包含了一堆的HandlerMethodArgumentResolver,而這個HandlerMethodArgumentResolver就是專門負責參數轉換用的:

除了SpringMVC自己提供的HandlerMethodArgumentResolver外,還支持讓咱們自己來提供,只要實現HandlerMethodArgumentResolver即可。SpringMVC通過調用HandlerMethodArgumentResolver類的supportsParameter方法來找到一個適合處理的HandlerMethodArgumentResolver,找到了合適的Resolver后,調用它的resolveArgument方法來進行參數轉換,最終得到所有的參數值。

對返回值進行處理

在調用方法完成后,如果有返回值,則調用returnValueHandlers.handleReturnValue來處理返回值,這個returnValueHandlers是HandlerMethodReturnValueHandler類型的實例,它包含了一堆的HandlerMethodReturnValueHandler,HandlerMethodReturnValueHandler就是專門處理返回值的實現類,除了默認的HandlerMethodReturnValueHandler外,SpringMVC還允許咱們自己實現HandlerMethodReturnValueHandler。

首先SpringMVC會獲取一個最合適的HandlerMethodReturnValueHandler:

選擇的邏輯就是循環調用所有HandlerMethodReturnValueHandler的supportsReturnType方法,返回為true的就是最合適的:

得到HandlerMethodReturnValueHandler后,調用它的handleReturnValue方法來完成返回值的處理。

2.SimpleControllerHandlerAdapter


SimpleControllerHandlerAdapter的handle方法,就是執行Controller實現類的handleRequest方法。

3.HttpRequestHandlerAdapter

HttpRequestHandlerAdapter的handle方法,就是執行HttpRequestHandler實現類的handleRequest方法。

四、視圖渲染

上述完成Adapter的handle方法后,會執行過濾器HandlerInterceptor的postHandle方法,這里不再描述。如果返回值是ModelAndView,則會調用processDispatchResult,來完成視圖渲染:

這里會先得到一個View,也就是視圖器,然后調用view的render方法來完成渲染處理。那核心點就是如何獲取這個View。

循環調用viewResolvers中ViewResolver的resolveViewName方法,得到最合適的View。默認情況下SpringMVC提供了四種類型的View:BeanNameViewResolver、ViewResolverComposite、
InternalResourceViewResolver、ContentNegotiatingViewResolver,當然咱們也可以自己實現ViewResolver,從而添加自己的View。

以上就是SpringMVC底層的大致實現原理,希望能給讀者朋友們一些幫助!

作者介紹

波哥,互聯行業從業10余年,先后擔任項目總監及架構師。目前專攻技術,喜歡研究技術原理。技術全面,主攻Java,精通JVM底層機制及Spring全家桶底層框架原理,熟練掌握當前主流的中間件、服務網格等技術原理。


責任編輯:華軒 來源: 51CTO
相關推薦

2022-12-19 08:00:00

SpringBootWeb開發

2023-07-11 08:00:00

2023-07-17 08:02:44

ZuulIO反應式

2021-02-20 08:40:19

HiveExplain底層

2021-08-29 07:41:48

數據HashMap底層

2023-07-20 10:04:37

底層路由配置

2019-12-16 10:01:54

Java開發Web

2021-08-31 07:36:22

LinkedListAndroid數據結構

2020-11-05 11:14:29

Docker底層原理

2023-01-04 07:54:03

HashMap底層JDK

2024-03-07 07:47:04

代碼塊Monitor

2023-10-18 10:55:55

HashMap

2021-07-05 07:51:43

JVM底層Python

2021-07-23 13:34:50

MySQL存儲InnoDB

2020-08-10 18:03:54

Cache存儲器CPU

2021-01-08 08:34:09

Synchronize線程開發技術

2022-11-15 08:10:23

SpringMyBatis底層

2023-02-12 23:23:30

2022-11-04 09:43:05

Java線程

2022-12-14 15:34:33

架構開發雙線程
點贊
收藏

51CTO技術棧公眾號

午夜成人鲁丝片午夜精品| 久草国产精品视频| 岛国精品一区| 一本色道亚洲精品aⅴ| 日韩欧美一区二区三区久久婷婷| 亚洲综合网av| 伊人久久综合| 日韩中文在线视频| 国产精品久久无码| 欧美啪啪网站| 亚洲成人免费观看| 亚洲一区三区视频在线观看| 人人妻人人澡人人爽精品日本| 丝瓜av网站精品一区二区 | 91亚洲国产精品| 日韩 欧美 精品| 一区二区三区网站| 亚洲区一区二区| jjzz黄色片| 日韩免费在线电影| 色综合天天综合网天天狠天天| 中文字幕一区二区中文字幕 | 精品国产亚洲日本| 91久久国产最好的精华液| 欧美久久在线观看| 18在线观看的| 一区免费观看视频| 日本婷婷久久久久久久久一区二区| 亚洲精品久久久久久无码色欲四季 | 亚州综合一区| 欧美成人在线直播| 日韩成人av免费| 成人在线高清| 日本高清不卡视频| 啊啊啊一区二区| 日本在线观看高清完整版| 中文字幕亚洲一区二区av在线| 欧洲亚洲一区| 精品欧美不卡一区二区在线观看 | 精品无码在线观看| 妖精一区二区三区精品视频| 亚洲国产精品福利| 高清中文字幕mv的电影| 2021年精品国产福利在线| 91精品国产综合久久久久久久久久| 久久精品免费网站| 日本综合久久| 欧美中文字幕久久| 日本老熟妇毛茸茸| 日本在线中文字幕一区二区三区| 欧美午夜激情在线| 99爱视频在线| 波多野结衣亚洲一二三| 欧美日韩亚洲精品内裤| 人妻熟妇乱又伦精品视频| 国产精品一二三产区| 天天综合网天天综合色| 欧美三级一级片| 欧美极品免费| 欧美日韩一级黄| 伊人影院综合在线| 91九色成人| 日韩写真欧美这视频| ass极品水嫩小美女ass| 日韩一区二区三区精品| 精品国产乱码久久久久久1区2区 | 99er热精品视频| 国产在线视频精品一区| 99久久久精品免费观看国产| 亚洲第一免费视频| aaa欧美色吧激情视频| 狼狼综合久久久久综合网| 久久电影视频| 136国产福利精品导航| 国产免费内射又粗又爽密桃视频| 性直播体位视频在线观看| 午夜久久电影网| 99色精品视频| 国产精品久久久久久久久免费高清 | 你微笑时很美电视剧整集高清不卡| 亚洲女人天堂成人av在线| 黄色片在线观看免费| 99久久夜色精品国产亚洲狼| 欧美激情videoshd| 国产成人精品777777| 六月丁香婷婷色狠狠久久| 91高跟黑色丝袜呻吟在线观看| 国产77777| 国产欧美日本一区视频| 久久天天东北熟女毛茸茸| av有码在线观看| 欧美亚洲动漫另类| 深夜做爰性大片蜜桃| 日日狠狠久久偷偷综合色| 中文字幕精品在线视频| 久久午夜无码鲁丝片| 久久久久久黄| 成人毛片网站| 在线观看黄av| 午夜精品久久久久久久久久久| 无限资源日本好片| 日本成人7777| 美女性感视频久久久| 欧美a∨亚洲欧美亚洲| 国内精品国产成人| 日本亚洲自拍| 1024在线看片你懂得| 欧美福利视频导航| 日本xxxxxxxxx18| 影音先锋一区| 96sao精品视频在线观看| 国产高清免费在线播放| 亚洲线精品一区二区三区| 日韩在线不卡一区| 女人丝袜激情亚洲| 久久久亚洲福利精品午夜| 91亚洲精品国偷拍自产在线观看| 91麻豆福利精品推荐| 欧美黄网在线观看| 欧洲美女精品免费观看视频| 亚洲美女黄色片| 国产精品白浆一区二小说| 九九**精品视频免费播放| 日本精品视频一区| 成人爽a毛片免费啪啪| 欧美v日韩v国产v| 国产免费无码一区二区视频| 蜜臀av性久久久久蜜臀av麻豆| 久久国产精品-国产精品| 狂野欧美激情性xxxx欧美| 制服丝袜亚洲网站| 中文乱码字幕高清一区二区| 视频一区二区三区入口| 久久精品日产第一区二区三区精品版| 亚洲电影视频在线| 日韩一区和二区| 亚洲不卡在线播放| 激情国产一区二区| 中文字幕色一区二区 | 国产精品日本一区二区| 成人video亚洲精品| 欧美丰满高潮xxxx喷水动漫| 国精品人伦一区二区三区蜜桃| 日产国产高清一区二区三区| 日本欧美精品久久久| 三级成人在线| 国产亚洲一区二区精品| 加勒比在线一区| 久久女同精品一区二区| 亚洲自偷自拍熟女另类| 日韩人体视频| 国产91在线高潮白浆在线观看| 青梅竹马是消防员在线| 色激情天天射综合网| 欧美三级视频网站| 激情小说亚洲一区| 经典三级在线视频| 日韩精品免费视频一区二区三区| 欧美成人精品在线视频| 午夜精品久久久久久久96蜜桃| 亚洲一区二区五区| 99久久国产精| 日韩二区三区四区| 国产精品99久久久久久大便| 欧美视频二区欧美影视| 欧美国产中文字幕| 神马久久久久久久久久| 日本韩国一区二区三区视频| 欧美巨胸大乳hitomi| 九九国产精品视频| 无码人妻少妇伦在线电影| 久久精品国产亚洲5555| 日韩av第一页| 久草中文在线| 日韩风俗一区 二区| 性色av免费观看| ●精品国产综合乱码久久久久| 丰满熟女人妻一区二区三区| 亚洲在线观看| 一区二区不卡在线视频 午夜欧美不卡' | 亚洲成a人片综合在线| 韩国无码一区二区三区精品| 免费黄网站欧美| 九九热只有这里有精品| 国产亚洲电影| 91偷拍精品一区二区三区| 亚洲一二三四| 美日韩精品免费视频| 亚洲av成人无码网天堂| 欧美日韩国产系列| 日韩熟女精品一区二区三区| 国产精品美女一区二区| 国产性猛交96| 青青国产91久久久久久| 久草视频这里只有精品| 可以在线看黄的网站| 婷婷久久综合九色综合99蜜桃| 欧美极品欧美精品欧美视频 | 99热在线这里只有精品| 欧美一区二区三| 国产精品传媒毛片三区| 国产综合色激情| 91地址最新发布| 麻豆av免费在线观看| 亚洲毛片在线免费观看| 99视频免费看| 在线观看成人小视频| 久久精品无码人妻| 自拍偷拍亚洲综合| 91l九色lporny| av动漫一区二区| 中文字幕欧美视频| 美女免费视频一区| 日韩在线第三页| 国产日韩欧美在线播放不卡| 日本高清xxxx| 日本在线电影一区二区三区| 久久99热只有频精品91密拍| 亚洲视频国产| 亚洲va男人天堂| 久久91超碰青草在哪里看| 91高清免费在线观看| 尤物在线网址| 免费av一区二区| 色综合久久久久综合一本到桃花网| 亚洲男人的天堂在线播放| 精品人妻无码一区二区色欲产成人 | 色窝窝无码一区二区三区| 91精品婷婷国产综合久久性色| 国产一卡二卡三卡| 一本大道久久a久久精品综合| 国产主播在线播放| 亚洲黄色在线视频| 成熟的女同志hd| 亚洲少妇中出一区| 少妇视频一区二区| 国产精品国产三级国产普通话99| 37p粉嫩大胆色噜噜噜| 99国产精品国产精品久久| 久久久久无码国产精品一区李宗瑞 | 国产在线观看免费播放| 国内欧美视频一区二区| 99久久99精品| 国产在线精品免费av| 欧美一级小视频| 国产乱码精品一区二区三区av| 性欧美在线视频| 国产精品白丝av| 日本女人性视频| 国产成人h网站| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 野花视频免费在线观看| 国产成人免费在线视频| 久久久精品人妻一区二区三区| 国产不卡视频一区| 亚洲图片欧美另类| 99国产麻豆精品| 欧洲av一区二区三区| 中文av字幕一区| 日韩一区二区不卡视频| 亚洲综合丝袜美腿| 日本在线观看中文字幕| 色香色香欲天天天影视综合网| 亚洲欧美一二三区| 91麻豆精品国产无毒不卡在线观看| 亚洲专区在线播放| 日韩欧美123| 亚洲av成人精品一区二区三区在线播放| 亚洲精品视频在线观看视频| 国产天堂素人系列在线视频| 中文字幕欧美视频在线| 老司机免费在线视频| 久久久欧美精品| 国产成人精品一区二三区在线观看| 国产精品中文久久久久久久| 美女国产精品久久久| 精选一区二区三区四区五区| av资源久久| 国产激情片在线观看| 香蕉成人久久| 午夜不卡福利视频| av中文字幕不卡| 国产一区二区三区视频播放| 亚洲激情成人在线| www.com亚洲| 欧美一区二区三区在线看| 性xxxxbbbb| 日韩一级黄色av| 蜜桃视频www网站在线观看| 国产精品偷伦一区二区| 99精品国产高清一区二区麻豆| 日韩啊v在线| 99精品视频免费| 欧美午夜精品理论片| 91女人视频在线观看| 午夜免费激情视频| 色综合久久天天综合网| 99国产精品欲| 亚洲一级一级97网| 爱情岛亚洲播放路线| 国产精品无码专区在线观看| 国产精品18hdxxxⅹ在线| 亚洲砖区区免费| 性8sex亚洲区入口| 无码人妻久久一区二区三区蜜桃| 国产欧美视频一区二区三区| 日本一区二区不卡在线| 欧美一区二区三区在线观看| 国产永久免费高清在线观看| 久久久久国产精品免费| 亚洲最大的免费视频网站| 日韩国产在线一区| 在线视频免费在线观看一区二区| 熟妇无码乱子成人精品| 中文字幕巨乱亚洲| 国产又黄又猛又粗又爽| 亚洲第一中文字幕| 综合久久2019| 92看片淫黄大片看国产片| 日韩黄色大片网站| 日韩有码免费视频| 91最新地址在线播放| 日本三级午夜理伦三级三| 欧美一级国产精品| 国产黄大片在线观看画质优化| 国产精品久久久久久五月尺| 无码少妇一区二区三区| 东北少妇不带套对白| 国产精品1区二区.| 国精产品一区一区二区三区mba| 欧美亚一区二区| 国产三级在线免费| 国产suv精品一区二区| 日本成人7777| 激情综合在线观看| 91在线视频在线| 中文字幕免费在线观看视频| 日韩av在线天堂网| 中文在线资源| 久久国产精品免费一区| 亚洲在线视频| 新91视频在线观看| 精品久久香蕉国产线看观看gif| www日本高清| 欧美激情奇米色| 久久电影在线| 日本成年人网址| 久久久99精品免费观看不卡| www.久久久久久久| 亚洲天堂成人在线| 国产资源一区| 国产精品亚洲天堂| 国产精品18久久久久久久久| 精国产品一区二区三区a片| 精品国产制服丝袜高跟| 黄视频在线免费看| 美乳视频一区二区| 天堂久久一区二区三区| 欧美a在线播放| 欧美酷刑日本凌虐凌虐| 在线观看电影av| 久久国产精品-国产精品| 久久精品综合| 中文字幕第69页| 日韩午夜精品电影| 美女露胸视频在线观看| 日韩国产在线一区| 国产乱子伦视频一区二区三区| 欧美成人aaa片一区国产精品| 精品国精品自拍自在线| 黑人精品一区| 中文字幕一区二区三区5566| 夫妻av一区二区| 日本黄色一级视频| 久久久精品国产网站| 国产一区调教| 岛国毛片在线播放| 亚洲国产视频一区二区| 男生女生差差差的视频在线观看| 国产欧美精品xxxx另类| 一区视频在线| 一级肉体全黄裸片| 日韩一级精品视频在线观看| 绿色成人影院| 自拍偷拍视频在线| 99视频一区二区| 国产又粗又猛又爽又黄的视频一| 欧美国产日韩在线| 日韩大片在线观看| 第四色在线视频| 欧美另类高清zo欧美| av中文资源在线资源免费观看| 亚洲一区二三| wwwwww.欧美系列| 国产激情视频在线播放 | 欧美日韩精品在线一区二区| 国产精品久久久久久久久免费丝袜| 高潮一区二区三区乱码| 国产日产欧美a一级在线| 亚洲国产激情|