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