【Spring專場】「MVC容器」不看原始碼就帶你認識核心流程以及運作原理

浩宇天尚發表於2022-01-10

前提回顧

之前已經寫了很多問斬針對於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容器的入口。

  1. HttpServletBean的init方法的呼叫
  2. 會呼叫相關的nitFrameworkServlet方法
  3. 會呼叫FrameworkServlet內的initServletBean方法。

子容器的初始化流程

  1. servletContext的容器獲取ContextServletListener中的建立的容器物件
  2. 如果this.WebApplicationContext 不是空,進設定配置相關的父容器和重新整理容器。
  3. 建立完對應的web容器之後,將上面的容器作為該容器的父容器,將rootContext作為父容器,並且同樣進行設定繫結到對應的ServletContext容器中。

相關文章