前提回顧
之前已經寫了很多問斬針對於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容器中。