springboot单例模式注入对象_springboot 请求流程简介
用了多年spring mvc 和 spring boot, 也沒(méi)怎么仔細(xì)研究過(guò)spring boot的源碼和內(nèi)部的執(zhí)行流程。主要是spring 太好用,提供了豐富的組件, 他是完全基于接口編程,配置方便, 使用靈活, 基本滿足我們開(kāi)發(fā)過(guò)程中的大多數(shù)需求。但是springboot內(nèi)部的細(xì)節(jié)也過(guò)于復(fù)雜, 沒(méi)有足夠的耐心還真不能完全搞懂。
最近在做一個(gè)模塊的時(shí)候, 花了點(diǎn)兒時(shí)間仔細(xì)閱讀了一下, 也算是對(duì)springboot的請(qǐng)求執(zhí)行流程有了大概的理解。接下來(lái)一一介紹下。
spring boot 在啟動(dòng)的時(shí)候是以Application 文件為入口, 啟動(dòng)內(nèi)嵌的tomcat 容器, 并且掃描給定范圍內(nèi)的configurations, beans, components,services, 注冊(cè)到 applicationContext 上下文中, 默認(rèn)是單例模式生成這些實(shí)例, 并且解析 靜態(tài)配置文件的內(nèi)容 當(dāng)作常量, 也一并加載到服務(wù)中。
當(dāng)一個(gè)client 需要請(qǐng)求API 的時(shí)候, spring boot 執(zhí)行流程如下(具體要結(jié)合項(xiàng)目中的配置流程, 這里僅根據(jù)當(dāng)前項(xiàng)目的流程介紹)
Tomcat thread 接受到請(qǐng)求調(diào)用 apache 中的 ApplicationFilterChain 執(zhí)行 doFilter 方法 , doFilter 執(zhí)行internalDoFilter, 此方法依次調(diào)用每個(gè) Filter 中的doFilter 方法, 并將ApplicationFilterChain 實(shí)例傳遞給每一個(gè)Filter。
接著所有doFIlter 執(zhí)行完畢, 控制權(quán)交回ApplicationFilterChain, 開(kāi)始調(diào)用Servlet, 類(lèi)型是 DispatcherServlet(org.springframework.web.servlet 下面), spring DispatcherServlet繼承 FrameworkServlet, FrameworkServlet 繼承 HttpServletBean , HttpServletBean繼承 httpServlet, 依次執(zhí)行 httpServlet: public service方法 -> FrameworkServlet: protected service方法 -> httpServlet: protected service方法 -> FrameworkServlet: doGet(或者其他的doXX方法, 這些doXX 方法被 FrameworkServlet override 了, 所以實(shí)際調(diào)用的是FrameworkServlet) -> DispatcherServlet: doService -> doDispatch (這個(gè) 邏輯最好去debug會(huì)理解的比較清楚。)
doDispatch 方法執(zhí)行攔截器的preHandle, 然后開(kāi)始調(diào)用spring 的核心類(lèi)RequestMappingHandlerAdapter: handle-> 執(zhí)行handleInternal 方法->創(chuàng)建 ServletInvocableHandlerMethod 實(shí)例(這個(gè)實(shí)例是方法級(jí)別, 即方法返回,實(shí)例會(huì)被垃圾回收)-> 注入全局的 的HandlerMethodArgumentResolvers , handlerMethodReturnValueHandlers, HttpMessageConvertors, ResponseBodyAdvices 等到ServletInvocableHandlerMethod 對(duì)象實(shí)例中。
并調(diào)用ServletInvocableHandlerMethod: invokeAndHandle 方法, 該方法通過(guò)java 反射機(jī)制 動(dòng)態(tài)調(diào)用目標(biāo)API 方法 進(jìn)入相對(duì)應(yīng)具體的controller,并執(zhí)行 具體的業(yè)務(wù)邏輯, ResponseEntity 作為 controller 的返回值。
執(zhí)行完畢 , 控制權(quán)返回 到 invokeAndHandle 方法, 接下來(lái)選擇合適的 HandlerMethodReturnValueHandler 的實(shí)現(xiàn)類(lèi)(HttpEntityMethodProcessor), 執(zhí)行 handleReturnValue 方法, 首先會(huì)判斷是否需要對(duì)response entity 進(jìn)行二次處理(ResponseBodyAdvice: beforeBodyWrite), 處理完成后, 調(diào)用注冊(cè)進(jìn)來(lái)的MessageConvertor 對(duì)返回信息進(jìn)行轉(zhuǎn)換處理, 比如使用faster Jackson 把對(duì)象類(lèi)型轉(zhuǎn)成 json 字符串,并以application/json 的形式返回 http response。
此時(shí),控制權(quán)轉(zhuǎn)會(huì)到 RequestMappingHandlerAdapter, 繼續(xù)執(zhí)行完畢, 控制權(quán)轉(zhuǎn)回 DispatcherServlet: doDispatch, 執(zhí)行對(duì)應(yīng)的攔截器 postHandle 方法, 最后執(zhí)行攔截器的afterCompletion 方法。
控制權(quán)轉(zhuǎn)回ApplicationFilterChain , 繼續(xù)執(zhí)行Filter 剩下的代碼。能夠講的就這么多, 接下來(lái)的不屬于本次研究范圍。
未完待續(xù)! 后面會(huì)具體介紹每個(gè)關(guān)鍵的spring 核心類(lèi)作用。
總結(jié)
以上是生活随笔為你收集整理的springboot单例模式注入对象_springboot 请求流程简介的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: wedo巡线机器人编程教程_这是一个机器
- 下一篇: ad20如何导入库_一文看懂如何使用(P