3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

今日分享開始啦,請大家多多指教~

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方法會被呼叫。

核心處理請求流程圖

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

入口

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

前端控制器DispatcherServlet也是一個Servlet,他父類的父類HttpServletBean覆寫了Servlet介面的init方法,在容器第一次載入或者第一次請求時會觸發(延遲載入),這個方法是Sring Mvc初始化的入口。

啟動初始化

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

容器啟動

Spring容器啟動過程,會執行Bean的載入、建立和初始化,此處以Controller層為例分析,暫不關注其他型別資源。

RequestMappingHandlerMapping類也是其中一個Bean,負責解析所有標識有@Controller或者@RequestMapping註解的Bean。

RequestMappingHandlerMapping的父類實現了InitializingBean介面,覆寫了afterPropertiesSet()方法,該介面是Spring的擴充套件點之一,在Bean初始化過程中,所i有屬性注入完畢之後,會執行一系列回撥(回撥入口:AbstractAutowireCapableBeanFactory#initializeBean),其中一個回撥會驗證當前類是否實現了InitializingBean介面,如果實現了會呼叫afterPropertiesSet()方法,此方法是解析Controller層路徑和方法對應關係的入口。

解析完畢之後會儲存在AbstractHandlerMethodMapping#MappingRegistry中,控制器方法HandlerMethod儲存了當前路徑對應方法的主要資訊,它只負責準備資料,封裝資料,而而不提供具體使用的方式方法。

在接收請求時會先根據路徑從urlLookup 中獲取匹配條件,然後根據匹配條件獲取控制器方法HandlerMethod。

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

策略初始化

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

對映器初始化

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

介面卡初始化(和對映器邏輯一致)

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

請求處理

流程圖

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

doDispatch方法解析

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

獲取處理器對映器

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

獲取處理器介面卡

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

執行攔截器前置處理preHandle方法

HandlerExecutionChain#applyPreHandle

攔截器的preHandle方法任意一個返回false則訪問不到目標方法

攔截器的afterCompletion方法一定會執行

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

執行控制器的目標方法

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

InvocableHandlerMethod#doInvoke

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

處理返回結果 & 執行攔截器afterCompletion方法

DispatcherServlet#processDispatchResult

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

a.檢視解析 & 模板引擎渲染

DispatcherServlet#render

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

b.呼叫攔截器afterCompletion方法,一定會執行

HandlerExecutionChain#afterCompletion

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

同一路徑時啟動報錯原始碼位置

AbstractHandlerMethodMapping#assertUniqueMethodMapping

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

3天熟練掌握SpringMVC的14個頂級技巧,學完快速渡劫變大神

今日份分享已結束,請大家多多包涵和指點!

相關文章