精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

在线成人免费网站| 五月综合激情婷婷六月色窝| 91精品久久久久久久久中文字幕| 美女视频久久久| 激情不卡一区二区三区视频在线| 亚洲黄色小视频| 蜜桃传媒视频麻豆一区| 国产又大又长又粗| 99在线精品免费视频九九视| 亚洲午夜性刺激影院| 美女被艹视频网站| 东京一区二区| 亚洲精品你懂的| 国产综合 伊人色| 97超碰人人草| 欧美亚洲一级| 欧美激情久久久| 国产精品理论在线| 欧亚精品一区| 欧美绝品在线观看成人午夜影视| 国产老熟妇精品观看| 国产原创精品视频| 久久视频一区二区| 国产精品免费一区二区| 一区二区三区播放| 免费日韩av片| 久久频这里精品99香蕉| 久久精品在线观看视频| 在线看成人短视频| 精品99999| 日韩av加勒比| 精品国产黄a∨片高清在线| 姬川优奈aav一区二区| 伊人久久婷婷色综合98网| 欧美大片aaa| 成人aaaa免费全部观看| av一区二区三区四区电影| 中文字幕在线播放不卡| 久久国产精品亚洲77777| 午夜精品久久17c| 欧美黄片一区二区三区| 97精品一区| 中文字幕欧美日韩在线| 亚洲图片另类小说| 一区二区三区日本久久久| 亚洲国产精品va| 国产精品日日摸夜夜爽| 久久久久久久久成人| 精品视频一区二区不卡| 中文字幕第21页| 精品免费av在线| 色婷婷av久久久久久久| 久久久久久久久久福利| 美女100%一区| 色老头久久综合| 欧美两根一起进3p做受视频| 欧美成人精品三级网站| 在线观看www91| 色悠悠久久综合网| 青青在线精品| 欧美一区二区视频观看视频| 久久精品无码一区二区三区毛片 | 精品国产一区二区三区小蝌蚪| 亚洲第一区第二区| 国产免费一区二区三区最新6| 红杏aⅴ成人免费视频| 亚洲成人网在线| 国产中文字幕一区二区| 九九久久电影| 中日韩美女免费视频网站在线观看| 影音先锋男人在线| 国产精品福利在线观看播放| 久久亚洲一区二区三区四区五区高 | 国产日本精品视频| 国产成人自拍在线| 国产视频精品网| 你懂的在线网址| 中文字幕成人在线观看| 国产精品8888| 日韩理论视频| 欧美性感一类影片在线播放| 日本在线观看视频一区| 成人春色在线观看免费网站| 精品香蕉在线观看视频一| 国产亚洲精品熟女国产成人| 亚洲女同一区| 91豆花精品一区| 中文字幕av影视| 国产精品911| 久久综合给合久久狠狠色| 国产高清自拍视频在线观看| 亚洲人成在线观看一区二区| 一二三四视频社区在线| 日本精品另类| 精品卡一卡二卡三卡四在线| 国产精品无码一区二区三区| 久久久国产精品| 91av视频在线免费观看| 91欧美日韩麻豆精品| 99久久精品免费精品国产| 性欧美精品一区二区三区在线播放| 免费看美女视频在线网站| 午夜精品福利在线| 午夜视频在线网站| 中文有码一区| 欧美激情一区二区三区高清视频| 黄色片视频免费| 成人免费视频视频| 这里只有精品66| 亚洲精品福利电影| 欧美成人猛片aaaaaaa| 国产精品久久久久久久av| 国内视频精品| 成人精品在线视频| 黄色国产在线| 亚洲成av人**亚洲成av**| 一区二区在线免费看| 私拍精品福利视频在线一区| 久久99视频免费| 一区二区www| 国产亚洲一区二区三区在线观看 | 日韩欧美一区在线观看| xxxx日本黄色| 免费在线播放第一区高清av| 国产99在线免费| 成码无人av片在线观看网站| 91精品福利在线| 精品少妇一区二区三区免费观| 欧美黄色一级视频| 国产欧美va欧美va香蕉在线| 污污网站免费在线观看| 亚洲成av人片在线观看无码| 伊人av在线播放| 欧美色图国产精品| 国产99久久精品一区二区 夜夜躁日日躁| 二区三区在线视频| 悠悠色在线精品| 精产国品一区二区三区| 天天久久综合| 成人h猎奇视频网站| 最新国产在线观看| 欧美日韩一二三| 亚洲精品国产精品国自| 石原莉奈在线亚洲三区| 日韩欧美精品一区二区三区经典 | 国产精品v日韩精品v欧美精品网站| 91最新国产视频| 成年人黄视频在线观看| 欧美一级一区二区| 妺妺窝人体色www婷婷| 国产激情视频一区二区在线观看| 日韩不卡一二区| 久久久久毛片免费观看| 欧美日本国产在线| 黄色www视频| 精品久久中文字幕久久av| 真人bbbbbbbbb毛片| 久久精品91| 亚洲成人一区二区三区| 亚洲国产天堂| 久久99亚洲热视| 五月婷婷六月色| 日本精品一级二级| 国产在线免费av| 国产一区二区三区蝌蚪| 国产日韩亚洲欧美在线| 日韩伦理一区二区三区| 国产精品av网站| 黄色av电影在线观看| 精品国产亚洲在线| 一级做a爰片久久毛片| 亚洲国产精品二十页| 日本网站在线看| 国产日韩一区二区三区在线| 日本一区免费在线观看| 91精品视频一区二区| 欧美激情久久久| 成人免费在线观看| 91精品福利在线一区二区三区| 精品少妇theporn| 久久蜜桃一区二区| 国产三级精品三级在线| 亚洲经典在线看| 亚洲人成影视在线观看| 亚洲精品一区国产| 日韩美女激情视频| av在线下载| 亚洲视频国产视频| jizz国产视频| 色哟哟精品一区| 91麻豆免费视频网站| www.99精品| 五月激情婷婷在线| 99热在线精品观看| 亚洲在线不卡| 欧美男男freegayvideosroom| 国产精品欧美日韩| 国产精品一区二区日韩| 日韩色av导航| 好男人免费精品视频| 欧美一区二区三区免费观看视频| 国产精品视频久久久久久久| 亚洲欧美中日韩| 亚洲最大免费视频| 国产在线精品一区二区三区不卡| 免费毛片小视频| 欧美一区二区三区久久精品| 日韩国产欧美一区| 美女av一区| 亚洲qvod图片区电影| 欧美与亚洲与日本直播| 午夜欧美大片免费观看| 黄黄的网站在线观看| 一本色道久久88精品综合| 人妻一区二区三区| 91精品中文字幕一区二区三区 | 91精品在线一区二区| 无码任你躁久久久久久久| 亚洲一区二区三区四区在线免费观看| 久操视频在线观看免费| 91一区二区在线| 免费啪视频在线观看| 国产真实乱子伦精品视频| 欧美精品第三页| 国产婷婷精品| 每日在线观看av| 欧美日韩亚洲国产精品| www亚洲国产| 欧美gay男男猛男无套| 日韩精品伦理第一区| 亚洲警察之高压线| 激情视频在线观看一区二区三区| 日本精品国产| 国产在线精品播放| 91福利精品在线观看| 日本国产精品视频| 中文在线资源| 日本国产一区二区三区| 亚洲欧洲自拍| 人人爽久久涩噜噜噜网站| 最近在线中文字幕| 欧美一级在线播放| 国产日韩电影| 国产精品pans私拍| 天堂久久午夜av| 国产精品久久久久av| 精品123区| 国产区精品在线观看| 日韩免费大片| 亚洲a区在线视频| 日韩高清在线观看一区二区| 99re6热在线精品视频播放速度| 国色天香久久精品国产一区| 亚洲一区二区三区乱码aⅴ| 电影91久久久| 99porn视频在线| 久久99国产精品久久99大师 | 国产精品69久久久久| 欧美va在线| 成人高清视频观看www| 成人综合日日夜夜| 国产精品久久国产精品| 狼人天天伊人久久| 日韩精彩视频| 偷偷www综合久久久久久久| av一区二区三区免费观看| 黄色成人精品网站| 日日摸日日碰夜夜爽av| 免费在线欧美视频| 污污视频在线免费| 不卡的av电影| 亚洲av熟女国产一区二区性色| 国产精品久久久久久久久图文区| 我要看黄色一级片| 亚洲福中文字幕伊人影院| 中文字幕av影院| 欧美日韩久久不卡| 欧美 日韩 中文字幕| 亚洲欧洲美洲在线综合| 欧美性videos| 97在线视频精品| 国精品产品一区| 成人激情av| 红桃视频在线观看一区二区| 在线视频一二三区| 香蕉久久a毛片| 亚洲黄色av片| 91免费视频观看| 天堂网avav| 欧美日韩美女视频| 91在线视频国产| 日韩av在线最新| 浪潮av一区| 青青草原一区二区| 久久久久久久久成人| 日本精品一区二区三区视频| 伊人情人综合网| www日韩视频| 成人午夜伦理影院| 男人av资源站| 色诱视频网站一区| 国产精品一级视频| 亚洲香蕉成视频在线观看| 色呦呦在线免费观看| 国产精品久久久久久久久久99| 51社区在线成人免费视频| 日韩在线三区| 国产精品视区| 一级全黄裸体片| 国产精品国产三级国产普通话三级| 黄色激情视频在线观看| 在线播放中文字幕一区| 青青草免费观看免费视频在线| 美女av一区二区| av成人免费| 欧美日韩三区四区| 1024日韩| 国产情侣久久久久aⅴ免费| 中文字幕在线观看不卡| 日韩精品在线一区二区三区| 亚洲激情 国产| 蜜乳av一区| 亚洲综合中文字幕68页| 色婷婷色综合| 美女网站视频黄色| 久久久久久久久久久电影| 999这里只有精品| 亚洲精品成人网| 国产99re66在线视频| 亚洲影影院av| 91精品国产91久久久久久密臀 | 久久久91精品国产一区二区精品| 久久无码精品丰满人妻| 欧美一区欧美二区| 黄网站免费在线观看| 成人欧美一区二区三区黑人孕妇| 欧美美女一区| 鲁一鲁一鲁一鲁一av| 国产日产亚洲精品系列| 91视频在线视频| 亚洲夜晚福利在线观看| 久久久成人av毛片免费观看| 欧美一区二区视频17c| 久久精品日产第一区二区| 久久久亚洲av波多野结衣| 欧美日韩在线影院| 日本一二三区在线视频| 人妖精品videosex性欧美| 五月天亚洲色图| 国产精品无码专区av在线播放| www欧美成人18+| av一级在线观看| 这里只有精品久久| 日韩久久99| 加勒比海盗1在线观看免费国语版| 国产精品一区二区久久不卡| 国产一级在线视频| 亚洲国产精品视频在线观看| 午夜裸体女人视频网站在线观看| 久久综合九色综合网站| 秋霞午夜av一区二区三区| www.xx日本| 日韩欧美精品在线视频| 岛国av在线播放| 欧美日韩在线播放一区二区| 奇米在线7777在线精品| 日日噜噜夜夜狠狠久久波多野| 欧美成人精品二区三区99精品| 538在线观看| 日本视频精品一区| 国内精品伊人久久久久av影院 | 2001个疯子在线观看| 免费看成人av| 麻豆国产91在线播放| avove在线播放| 日韩av在线直播| 四虎精品永久免费| www.国产在线视频| 国产日韩精品一区| 精品久久在线观看| 欧美一级片在线播放| 久久精品国产99久久| 亚洲一区和二区| 欧美在线999| 国产网红在线观看| 日韩av图片| 国产69精品久久777的优势| 亚洲精品77777| 中文国产亚洲喷潮| av在线亚洲色图| 91精品无人成人www| 亚洲综合图片区| 国产在线电影| 国产精品久久久久久久久婷婷| 日精品一区二区| 国产一级片免费| 色婷婷久久一区二区| 日韩精品亚洲aⅴ在线影院| 17c国产在线| 欧美午夜女人视频在线|