【Spring專場】「MVC容器」不看源碼就帶你認識核心流程以及運作原理
- 2022 年 1 月 10 日
- 筆記
- 【技術專區-Spring】
前提回顧
之前已經寫了很多問斬針對於SpringMVC的的執行原理和核心流程,在此再進行冗餘介紹就沒有任何意義了,所以我們主要考慮的就是針對於SpringMVC還沒但大框架有介紹的相關內容解析分析和說明,那麼接下來就讓我們來接入Spring框架在核心的三大框架之一。
DispatcherServlet的族譜
核心類的繼承關係
核心的主要角色
XXAware的接通
主要用於BeanPostProcessor進行相關的獲取系統內部的相關的XX組件功能的實現機制,通過實現該實現類的介面後,就可以非常方便向spring框架索取一些框架資訊。
EnvironmentCapable
可以通過該類介面實現機制,進行獲取相關的環境變數對象。
HtpServeltBean
是HttpServlet抽象的簡單實現介面,以及對於相關的功能的進行一步執行擴展
FrameworkServlet執行類
主要是Spring web框架的一個基礎父類,他會在dispatcherServlet創建之前創建一個父容器和自容器之間的關係。
DispatcherServlet實現類
主要是Spring web框架的,也是之前我們文章介紹的核心機制執行流程,它主要用於協調SpringMVC的整體運作流程和執行流程,初始化各個組件機制,比如:HandlerMapping組件、HandlerAdapter組件和HandlerExecuteChain。
借用一個網圖(懶得自己在進行畫了)
容器的創建過程
主要在Spring框架和MVC框架領域裡面主要分為兩種類型的容器:我們將他們定義為:業務容器和web容器。
容器會先進性建立業務容器(也可以說是父容器機制),再進行建立web容器(子容器),在初始化web容器的時候,會將父容器綁定到子容器中,作為其父容器。
父容器的初始化入口
主要依靠我們系統內部的ContextLoaderListener的contextInitialized方法,當ServletContext類被載入後,監聽的contextInitailized方法就會被servlet容器進行調用。
父容器的創建流程
contextIntialized方法被調用之後,會進行創建createWebApplicationContext方法,調用內部的determineContextClass方法,進行判斷初始化容器的類型,默認為XmlWebApplicationContext對象類。主要採用instantiateClass方法進行反射生成對應的容器對象。
此外對於SprringBoot以及其他類型的容器而言更多可能會選擇ConfigureAndRefreshWebApplicationContext或者AnnotationConfigApplicationContext類,前者更多會進行刷新容器實現和使用,後者主要以JavaConfig的方式進行構建spring容器組件。
最後將生產的父子容器對象設置和注入到相關的ServletContext容器的全局上下文區。
子容器的初始化入口
HttpServletBean核心類覆蓋了httpServlet類的init的方法,這個就是創建web容器的入口。
- HttpServletBean的init方法的調用
- 會調用相關的nitFrameworkServlet方法
- 會調用FrameworkServlet內的initServletBean方法。
子容器的初始化流程
- servletContext的容器獲取ContextServletListener中的創建的容器對象
- 如果this.WebApplicationContext 不是空,進設置配置相關的父容器和刷新容器。
- 創建完對應的web容器之後,將上面的容器作為該容器的父容器,將rootContext作為父容器,並且同樣進行設置綁定到對應的ServletContext容器中。