3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神
今日分享開始啦,請大家多多指教~
Servlet生命週期瞭解
Servlet的生命(週期)是由容器(eg:Tomcat)管理的,換句話說,Servlet程式設計師不能用程式碼控制其生命。
載入和例項化:時機取決於web。xml的定義,如果有x則在容器啟動時(eg:SSM),反之則在第一次針對這個Servlet的請求發生時(eg:Spring Boot)。
初始化(init):例項化後會立馬進行初始化,也就是執行init方法,init方式只會執行一次。
請求處理:初始化後,Servlet就可以接受請求了,基本方式是執行Servlet介面中的service方法。
終止服務:容器會在合適的時候銷燬某個Servlet物件,這個策略取決於容器的開發者/商,銷燬時destroy方法會被呼叫。
核心處理請求流程圖
入口
前端控制器DispatcherServlet也是一個Servlet,他父類的父類HttpServletBean覆寫了Servlet介面的init方法,在容器第一次載入或者第一次請求時會觸發(延遲載入),這個方法是Sring Mvc初始化的入口。
啟動初始化
容器啟動
Spring容器啟動過程,會執行Bean的載入、建立和初始化,此處以Controller層為例分析,暫不關注其他型別資源。
RequestMappingHandlerMapping類也是其中一個Bean,負責解析所有標識有@Controller或者@RequestMapping註解的Bean。
RequestMappingHandlerMapping的父類實現了InitializingBean介面,覆寫了afterPropertiesSet()方法,該介面是Spring的擴充套件點之一,在Bean初始化過程中,所i有屬性注入完畢之後,會執行一系列回撥(回撥入口:AbstractAutowireCapableBeanFactory#initializeBean),其中一個回撥會驗證當前類是否實現了InitializingBean介面,如果實現了會呼叫afterPropertiesSet()方法,此方法是解析Controller層路徑和方法對應關係的入口。
解析完畢之後會儲存在AbstractHandlerMethodMapping#MappingRegistry中,控制器方法HandlerMethod儲存了當前路徑對應方法的主要資訊,它只負責準備資料,封裝資料,而而不提供具體使用的方式方法。
在接收請求時會先根據路徑從urlLookup 中獲取匹配條件,然後根據匹配條件獲取控制器方法HandlerMethod。
策略初始化
對映器初始化
介面卡初始化(和對映器邏輯一致)
請求處理
流程圖
doDispatch方法解析
獲取處理器對映器
獲取處理器介面卡
執行攔截器前置處理preHandle方法
HandlerExecutionChain#applyPreHandle
攔截器的preHandle方法任意一個返回false則訪問不到目標方法
攔截器的afterCompletion方法一定會執行
執行控制器的目標方法
InvocableHandlerMethod#doInvoke
處理返回結果 & 執行攔截器afterCompletion方法
DispatcherServlet#processDispatchResult
a.檢視解析 & 模板引擎渲染
DispatcherServlet#render
b.呼叫攔截器afterCompletion方法,一定會執行
HandlerExecutionChain#afterCompletion
同一路徑時啟動報錯原始碼位置
AbstractHandlerMethodMapping#assertUniqueMethodMapping
今日份分享已結束,請大家多多包涵和指點!
相關文章
- 2021-09-20專家提醒:別進入這兩個除甲醛的誤區!它們是甲醛的“幫兇”
- 2021-09-195歲女童因甲醛得病,專家提示:家長們不該疏忽這2個“訊號”
- 2021-09-18挽回老公的方法:老公有外遇要怎麼處理,如何挽回老公?
- 2021-09-14清爽開胃,夏天必吃,在家也可以自己做涼皮
- 2021-06-13雲原生推動全雲開發與實踐