導(dǎo)讀5分鐘輕松了解一個http求的處理過程_第1頁
導(dǎo)讀5分鐘輕松了解一個http求的處理過程_第2頁
導(dǎo)讀5分鐘輕松了解一個http求的處理過程_第3頁
導(dǎo)讀5分鐘輕松了解一個http求的處理過程_第4頁
導(dǎo)讀5分鐘輕松了解一個http求的處理過程_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

首先,回顧下我們是怎么添加一個HTTP1234567publicclassoWorldController(path="hi",method=publicStringreturn}請求的Path:那么,假設(shè)讓你自己去實現(xiàn)HTTP代代123456789publicclassMap<RequestKey,Method>mapper=newpublicObjecthandle(HttpRequesthttpRequest){RequestKeyrequestKey=getRequestKey(httpRequest);Methodmethod=Object[]args=resolveArgsAccordingToMethod(httpRequest,returnmethod.invoke(controllerObject,}需要有一個地方(例如Map)去從HTTPpath/method到具體執(zhí)行方法的映射除此之外,你還需要一個東西,就是利用底層通信層來解析出你的HTTP請求。只有解析出請求了,才能知道path/method等信息,才有后續(xù)的執(zhí)行,否則也是“巧婦難為無米所以綜合來看,你大體上需要這些過程才能完成一個請求的解析和處理。那么接下來我們就按照處理順序分別看下SringBoot是如何實現(xiàn)的,對應(yīng)的一些關(guān)鍵實現(xiàn)又長什么樣。首先,解析HTTP請求。對于Spring而言,它本身并不提供通信層的支持,它是依賴于Tomcat、JettySpringBoot接依賴了Tomcat。依賴關(guān)系圖如下:可以通過下面的配置從默認(rèn)的Tomcat切換到Jetty:<!--UseJettyinstead--TomcatSpringBootTomcat關(guān)于Tomcat說白了,就是調(diào)用下述代碼行就會啟動1SpringApplication.run(Application.class,那為什么使用的是Tomcat123456789classServletWebServerFactoryConfigurationBeanMethods=@ConditionalOnClass({Servlet.class,Tomcat.class,UpgradeProtocol.class})@ConditionalOnMissingBean(value=ServletWebServerFactory.class,search=SpublicstaticclassEmbeddedTomcat{return}} BeanMethods=@ConditionalOnClass({Servlet.class,Server.class,Loader.class,@ConditionalOnMissingBean(value=ServletWebServerFactory.class,search=publicstaticclassEmbeddedJettypublicJettyServletWebServerFactoryObjectProvider<JettyServerCustomizer>serverCustomizers)return 2729//30TomcatJAR,所以下面的條件會成立,進而就依賴上了11@ConditionalOnClass({Servlet.class,Tomcat.class,UpgradeProtocol.class有了Tomcat后,當(dāng)一個HTTP請求時,會觸發(fā)Tomcat底層提供的NIO通信來完123456789publicvoidrun(){while(true){的if(wakeupCounter.getAndSet(-1)>0){keyCount=selector.selectNow();}elsekeyCount= SelectionKeysk=iNioSocketWrappersocketWrapper=processKey(sk,} 26上述代碼會完成請求的和處理,最終在processKey中把請求丟入線程池去在上述調(diào)用中,最終會進入SpringBoot的處理,即DispatcherServlet(上述調(diào)用棧沒有繼續(xù)截取完整調(diào)用,所以未顯示)。可以說,DispatcherServletHTTP請求的調(diào)度程序,為每一個Web請求映射一個請求的處理執(zhí)行體(API我們可以看下它的是什么?它本質(zhì)上就是一種Servlet,所以它是由下面的Servlet核最終它執(zhí)行到的是下面的doServiceprotectedvoiddoService(HttpServletRequestrequest,HttpServletResponsedoDispatch(request,41123456789protectedvoiddoDispatch(HttpServletRequestrequest,HttpServletResponse////1.分發(fā):DeterminehandlerforthecurrentHandlerExecutionChainmappedHandler=////Determinehandleradapterforthecurrentrequest.HandlerAdapterha=getHandlerAdapter(mappedHandler.getHandler());////2.執(zhí)行:Actuallyinvokethemv=ha.handle(processedRequest,response,//}尋找方法參考Dispachererlet#etanler,具體的查找遠(yuǎn)比開始給出的Map查找來得復(fù)雜,但是無非還是一個根據(jù)請求尋找候選執(zhí)行方法的過程,這里我們可以通過一個調(diào)試視圖感受下這種對應(yīng)關(guān)系:Map,其實就是上述調(diào)試視圖中的RequestMapHandlerMap。HTTP樣一個疑惑:Handler的映射是如何構(gòu)建出來的呢?說白了,關(guān)鍵就是RequestMapHandlerMap這個Bean的構(gòu)建過程afterPropertiesSet HandlerMethodMap#processCandidateBean方法protectedvoidprocessCandidateBean(StringbeanName)if(beanType!=null&&isHandler(beanType))4456}}isHandler(beanType12345protectedbooleanisHandler(Class<?>beanType)return(AnnotatedElementUtils.hasAnnotation(beanType,Controller.class)AnnotatedElementUtils.hasAnnotation(beanType,}這里你會發(fā)現(xiàn),判斷的關(guān)鍵條件是,是否標(biāo)記了合適的注解(Controller或者RequestMap)。只有標(biāo)記了,才能添加到Map信息。換言之,Spring在構(gòu)建RequestMapHandlerMap時,會處理所有標(biāo)記Controller和RequestMap的注解,然后解析它們構(gòu)建出請求到處理的映射關(guān)系。以上即為SpringBoot處理一個HTTP請求的過程,無非就是綁定一個內(nèi)嵌容(To

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論