前提回顧
之前已經(jīng)寫了很多問斬針對于SpringMVC的的執(zhí)行原理和核心流程,在此再進行冗余介紹就沒有任何意義了,所以我們主要考慮的就是針對于SpringMVC還沒但大框架有介紹的相關(guān)內(nèi)容解析分析和說明,那么接下來就讓我們來接入Spring框架在核心的三大框架之一。
DispatcherServlet的族譜
核心類的繼承關(guān)系

核心的主要角色
XXAware的接通
主要用于BeanPostProcessor進行相關(guān)的獲取系統(tǒng)內(nèi)部的相關(guān)的XX組件功能的實現(xiàn)機制,通過實現(xiàn)該實現(xiàn)類的接口后,就可以非常方便向spring框架索取一些框架信息。
EnvironmentCapable
可以通過該類接口實現(xiàn)機制,進行獲取相關(guān)的環(huán)境變量對象。
HtpServeltBean
是HttpServlet抽象的簡單實現(xiàn)接口,以及對于相關(guān)的功能的進行一步執(zhí)行擴展
FrameworkServlet執(zhí)行類
主要是Spring web框架的一個基礎(chǔ)父類,他會在dispatcherServlet創(chuàng)建之前創(chuàng)建一個父容器和自容器之間的關(guān)系。
DispatcherServlet實現(xiàn)類
主要是Spring web框架的,也是之前我們文章介紹的核心機制執(zhí)行流程,它主要用于協(xié)調(diào)SpringMVC的整體運作流程和執(zhí)行流程,初始化各個組件機制,比如:HandlerMapping組件、HandlerAdapter組件和HandlerExecuteChain。
借用一個網(wǎng)圖(懶得自己在進行畫了)

容器的創(chuàng)建過程
主要在Spring框架和MVC框架領(lǐng)域里面主要分為兩種類型的容器:我們將他們定義為:業(yè)務(wù)容器和web容器。
容器會先進性建立業(yè)務(wù)容器(也可以說是父容器機制),再進行建立web容器(子容器),在初始化web容器的時候,會將父容器綁定到子容器中,作為其父容器。
父容器的初始化入口
主要依靠我們系統(tǒng)內(nèi)部的ContextLoaderListener的contextInitialized方法,當(dāng)ServletContext類被加載后,監(jiān)聽的contextInitailized方法就會被servlet容器進行調(diào)用。
父容器的創(chuàng)建流程
contextIntialized方法被調(diào)用之后,會進行創(chuàng)建createWebApplicationContext方法,調(diào)用內(nèi)部的determineContextClass方法,進行判斷初始化容器的類型,默認(rèn)為XmlWebApplicationContext對象類。主要采用instantiateClass方法進行反射生成對應(yīng)的容器對象。
此外對于SprringBoot以及其他類型的容器而言更多可能會選擇ConfigureAndRefreshWebApplicationContext或者AnnotationConfigApplicationContext類,前者更多會進行刷新容器實現(xiàn)和使用,后者主要以JavaConfig的方式進行構(gòu)建spring容器組件。
最后將生產(chǎn)的父子容器對象設(shè)置和注入到相關(guān)的ServletContext容器的全局上下文區(qū)。
子容器的初始化入口
HttpServletBean核心類覆蓋了httpServlet類的init的方法,這個就是創(chuàng)建web容器的入口。
- HttpServletBean的init方法的調(diào)用
- 會調(diào)用相關(guān)的nitFrameworkServlet方法
- 會調(diào)用FrameworkServlet內(nèi)的initServletBean方法。
子容器的初始化流程
- servletContext的容器獲取ContextServletListener中的創(chuàng)建的容器對象
- 如果this.WebApplicationContext 不是空,進設(shè)置配置相關(guān)的父容器和刷新容器。
- 創(chuàng)建完對應(yīng)的web容器之后,將上面的容器作為該容器的父容器,將rootContext作為父容器,并且同樣進行設(shè)置綁定到對應(yīng)的ServletContext容器中。