幹貨分享,SpringBoot中Web接口資源是如何被管理起來呢?
一個請求,通過在浏覽器上輸入了一個url,是如何被SpringWeb比對到對應的方法的呢?
帶着這個疑問我們來學習本篇。

浏覽器的請求,是如何被映射到後端服務的方法上呢?
後端服務使用SpringBoot隻使用了一個注解就提供了web服務的實作原理是什麼呢?
帶着上面的疑問,小編通過源碼的方式帶你一看究竟吧。 為了能讓各位童鞋更好的更容易的了解。第一趴我們先來補充點知識點。
在java體系中,類是可以被繼承,接口可以被實作。但是注解沒有這些概念,而是有一個派生的概念。舉例,注解A。被标記了在注解B頭上,那麼我們可以說注解B就是注解A的派生。下面我們舉一個例子:
queryBbsPostAll是用了PostMapping類進行标記是一個POST資源
我們通過main方法裡面可以知道。通過反射我們能拿到Method上的PostMapping注解資訊。
但是看這一行AnnotatedElementUtils.hasAnnotation(queryBbsPostAll,RequestMapping.class)為什麼也是true呢?
沒錯因為PostMapping是RequestMapping的派生注解。
請記住這個小的知識點,後面的邏輯會用到。因為下面後有大量的源碼,為了友善标注,小編使用截圖的形式,在截圖上會加上注釋資訊。
通過跟進源碼,我們會發現這樣一個類。AbstractHandlerMethodMapping。其實作了實作 InitializingBean接口。在目前 Bean初始化時候會執行afterPropertiesSet -> initHandlerMethods。
RequestMappingHandlerMapping解析Method上的RequestMapping資訊
isHandler 方法判斷是否是web資源類。當一個類被标記了 @Controller 或者@RequestMapping。 注意 @RestController 是@Controller的派生類。是以這裡隻用判斷 @Controller 或者@RequestMapping就行了。
detectHandlerMethods方法就是真正開始解析Method的邏輯。通過解析Method上的 @RequestMapping或者其他派生的注解。生成請求資訊。 注意這個請求資訊裡面也是有很多邏輯的不過不是本篇讨論的重點,就不說了。稍微提一下。根據規則來比對url邏輯就在這裡面。
這裡我們能看到源碼裡拿到了Method并拿到了執行這個Method的執行個體Bean。在這裡封裝成了HandlerMethod并注冊到了MappingRegistry中。
在注冊的過程中把RequestMapping中的路徑資訊同僚也放到一個urlLookup中。key是url,value是Mapping資訊。
到這裡其實我們就把本篇的議題就說明清楚了。下面我們在看下SpringWeb是如何将http請求資訊路由到具體的HandlerMethod的吧。
看了前面的截圖,我們知道Spring是如何把這些Web資源資訊給儲存起來的了。然後就看是DispatcherServlet的邏輯了。 首先DispatcherServlet 是一個Servlet。Servlet相信大家都都知道就不重點說原理。 我們直接看doService -> doDispatch 方法
根據請求路徑,找到從Mapping資訊,然後根據Mapping資訊比對到具體的HandlerMethod。 ok本篇内容就到這裡。謝謝大家。