日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

詳解SpringMVC底層原理

來源: 責編: 時間:2024-01-08 09:17:25 197觀看
導讀作者 | 波哥審校 | 重樓筆者的專業是軟件技術,主修Java,記得剛開始寫Web應用的時候,都是直接寫Servlet,有多少個請求服務就寫多少個Servlet,于是一個系統中出現了一堆的Servlet,記得那會JSP也很流行,后來又經歷了Struts1、St

作者 | 波哥NAt28資訊網——每日最新資訊28at.com

審校 | 重樓NAt28資訊網——每日最新資訊28at.com

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

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

我們先來通過一張圖了解下SpringMVC處理請求的整體流程:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

使用過SpringMVC的老鐵們都知道,在SpringMVC中最核心的就是DispatcherServlet類,接下來筆者將從DispatcherServlet如何處理請求的整體流程來闡述它的底層實現。NAt28資訊網——每日最新資訊28at.com

DispatcherServlet毫無疑問是一個HttpServlet,因此可以追蹤到所有的請求都會進入到doDispatch方法中,而這個方法就是咱們要解剖的方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

該方法主要有幾條主線:獲取HandlerExecutionChain、獲取HandlerAdapter、調用Adapter的handle方法、視圖處理器處理。下面我們將從這幾個主線逐一分析。NAt28資訊網——每日最新資訊28at.com

一、獲取HandlerExecutionChain

首先說明下這個HandlerExecutionChain,它里面封裝了一堆的Interceptor攔截器,以及Handler,它是一個處理鏈,通過getHandler方法獲取得到:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

從代碼中我看到,這里循環handlerMappings,調用HandlerMapping的getHandler方法來獲取HandlerExecutionChain對象,獲取到了就返回,那這個handlerMappings都包含了哪些HandlerMapping呢?它們是什么時候被塞到handlerMappings集合中去的?NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

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

NAt28資訊網——每日最新資訊28at.com

我們來看下initHandlerMappings方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

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

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

我們先來看它們內部到底存放了什么,以及getHandler方法的具體邏輯,我們主要看BeanNameUrlHandlerMapping和
RequestMappingHandlerMapping。NAt28資訊網——每日最新資訊28at.com

1.BeanNameUrlHandlerMapping

NAt28資訊網——每日最新資訊28at.com

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

NAt28資訊網——每日最新資訊28at.com

那上面"對應的Handler"需要滿足什么條件呢?NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

看上面的判斷邏輯,表明如果bean的名稱是以"/"開頭,則滿足條件,然后從Spring的Bean工廠中獲取到對應的Bean實例,添加到handlerMap集合。NAt28資訊網——每日最新資訊28at.com

在具體使用時,可以實現Controller和HttpRequestHandler接口,同時Component注解的value值以"/"開頭。NAt28資訊網——每日最新資訊28at.com

好,數據準備完成,接下來就是getHandler方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

跟蹤代碼可以看出,就是根據URL從handlerMap獲取到對應的實例,隨后再將handler和HandlerInterceptor封裝成HandlerExecutionChain對象:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

2.RequestMappingHandlerMapping

NAt28資訊網——每日最新資訊28at.com

RequestMappingHandlerMapping是InitializingBean的實現類,在bean的初始化階段,它的afterPropertiesSet方法會被Spring調用,跟蹤該方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

發現獲取所有的bean實例,然后循環調用processCandidateBean方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

必須滿足一定條件的實例才會被處理,這個條件就是類上面包含Controller或者RequestMapping注解:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

對于滿足上述條件的bean,會在detectHandlerMethods方法中將RequestMapping注解中的路徑和對應的方法封裝成HandlerMethod,并添加到mappingLookup集合中。NAt28資訊網——每日最新資訊28at.com

然后調用getHandler方法,根據請求URL從mappingLookup集合中取出HandlerMethod,并封裝成HandlerExecutionChain對象。NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

二、獲取HandlerAdapter

在上述調用getHandler方法,獲取到HandlerExecutionChain對象后,接下來調用getHandlerAdapter方法獲取HandlerAdapter:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

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

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

同上,HandlerAdapter的初始化也是在initStrategies方法中發起的,在initHandlerAdapters方法中完成具體的添加:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

可以看到,從Spring容器中獲取所有的HandlerAdapter類型的Bean添加到handlerAdapters中,默認情況下包括:
RequestMappingHandlerAdapter、HandlerFunctionAdapter、HttpRequestHandlerAdapter、SimpleControllerHandlerAdapter四個實現類的Bean實例。NAt28資訊網——每日最新資訊28at.com

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

我們這里主要講下
RequestMappingHandlerAdapter、SimpleControllerHandlerAdapter和HttpRequestHandlerAdapter的supports實現邏輯:NAt28資訊網——每日最新資訊28at.com

  • RequestMappingHandlerAdapter

NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

Handler是HandlerMethod類型,則由RequestMappingHandlerAdapter處理。NAt28資訊網——每日最新資訊28at.com

  • SimpleControllerHandlerAdapter

NAt28資訊網——每日最新資訊28at.com

如果handler是Controller的實現類,則會由SimpleControllerHandlerAdapter處理。NAt28資訊網——每日最新資訊28at.com

  • HttpRequestHandlerAdapter

如果handler是HttpRequestHandler的實現類,則會由HttpRequestHandlerAdapter處理。NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

三、調用HandlerAdapter的handle方法

在獲取到HandlerAdapter后,還會調用interceptor的preHandle方法,這里就不詳細描述了。這里咱們直接看HandlerAdapter的handle方法的具體實現。NAt28資訊網——每日最新資訊28at.com

1.RequestMappingHandlerAdapter

相對于其他Adapter的處理方法,RequestMappingHandlerAdapter要復雜的的多NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

顯示創建ServletInvocableHandlerMethod對象,然后往對象中添加HandlerMethodArgumentResolvers和HandlerMethodReturnValueHandlers,這兩個接口很重要,是SpringMVC的兩個重要擴展點。NAt28資訊網——每日最新資訊28at.com

隨后開始處理,總結來說主要做了兩件事:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

獲取方法參數值,然后調用方法:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

執行方法相對簡單,咱們主要來看看是如何獲取方法參數值的:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

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

NAt28資訊網——每日最新資訊28at.com

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

對返回值進行處理

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

NAt28資訊網——每日最新資訊28at.com

首先SpringMVC會獲取一個最合適的HandlerMethodReturnValueHandler:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

選擇的邏輯就是循環調用所有HandlerMethodReturnValueHandler的supportsReturnType方法,返回為true的就是最合適的:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

得到HandlerMethodReturnValueHandler后,調用它的handleReturnValue方法來完成返回值的處理。NAt28資訊網——每日最新資訊28at.com

2.SimpleControllerHandlerAdapter

NAt28資訊網——每日最新資訊28at.com


SimpleControllerHandlerAdapter的handle方法,就是執行Controller實現類的handleRequest方法。NAt28資訊網——每日最新資訊28at.com

3.HttpRequestHandlerAdapter

NAt28資訊網——每日最新資訊28at.com

HttpRequestHandlerAdapter的handle方法,就是執行HttpRequestHandler實現類的handleRequest方法。NAt28資訊網——每日最新資訊28at.com

四、視圖渲染

上述完成Adapter的handle方法后,會執行過濾器HandlerInterceptor的postHandle方法,這里不再描述。如果返回值是ModelAndView,則會調用processDispatchResult,來完成視圖渲染:NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

這里會先得到一個View,也就是視圖器,然后調用view的render方法來完成渲染處理。那核心點就是如何獲取這個View。NAt28資訊網——每日最新資訊28at.com

NAt28資訊網——每日最新資訊28at.com

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

以上就是SpringMVC底層的大致實現原理,希望能給讀者朋友們一些幫助!NAt28資訊網——每日最新資訊28at.com

作者介紹

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


NAt28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-57910-0.html詳解SpringMVC底層原理

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 九條微服務最佳實踐,你學會了哪條?

下一篇: 理解 Node.js 中的事件循環

標簽:
  • 熱門焦點
  • 一文搞定Java NIO,以及各種奇葩流

    大家好,我是哪吒。很多朋友問我,如何才能學好IO流,對各種流的概念,云里霧里的,不求甚解。用到的時候,現百度,功能雖然實現了,但是為什么用這個?不知道。更別說效率問題了~下次再遇到,
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 認真聊聊東方甄選:如何告別低垂的果實

    來源:山核桃作者:財經無忌爆火一年后,俞敏洪和他的東方甄選依舊是頗受外界關心的“網紅”。7月5日至9日,為期5天的東方甄選“甘肅行”首次在自有App內直播,
  • 消息稱小米汽車開始篩選交付中心:需至少120個車位

    IT之家 7 月 7 日消息,日前,有微博簡介為“汽車行業從業者、長三角一體化擁護者”的微博用戶 @長三角行健者 發文表示,據經銷商集團反饋,小米汽車目前
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • 聯想的ThinkBook Plus下一版曝光,鍵盤旁邊塞個平板

    ThinkBook Plus 是聯想的一個特殊筆記本類別,它在封面放入了一塊墨水屏,也給人留下了較為深刻的印象。據有人爆料,聯想的下一款 ThinkBook Plus 可能更特殊,它
  • 最薄的14英寸游戲筆記本電腦 Alienware X14已可以購買

    2022年1月份在國際消費電子展(CES2022)上首次亮相的Alienware新品——Alienware X14現在已經可以購買了,這款筆記本電腦被譽為世界上最薄的 14 英寸游戲筆
  • 電博會上海爾智家模擬500平大平層,還原生活空間沉浸式體驗

    電博會為了更好地讓參展觀眾真正感受到智能家居的絕妙之處,海爾智家的程傳嶺先生同樣介紹了展會上海爾智家的模擬500平大平層,還原生活空間沉浸式體驗。程傳
Top 主站蜘蛛池模板: 北宁市| 内丘县| 湘潭市| 三江| 读书| 新干县| 鞍山市| 白沙| 澄迈县| 新化县| 盘山县| 滕州市| 双柏县| 陇南市| 邛崃市| 沈阳市| 连城县| 加查县| 罗山县| 洪洞县| 徐州市| 呼玛县| 天峨县| 新沂市| 湖北省| 赫章县| 五常市| 西乌珠穆沁旗| 米泉市| 临朐县| 交城县| 鱼台县| 仁布县| 皋兰县| 军事| 阳东县| 五华县| 南城县| 大兴区| 勐海县| 新营市|