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

前提回顧

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

DispatcherServlet的族譜

核心類的繼承關(guān)系

image

核心的主要角色

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)圖(懶得自己在進行畫了)


image

容器的創(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容器的入口。

  1. HttpServletBean的init方法的調(diào)用
  2. 會調(diào)用相關(guān)的nitFrameworkServlet方法
  3. 會調(diào)用FrameworkServlet內(nèi)的initServletBean方法。

子容器的初始化流程

  1. servletContext的容器獲取ContextServletListener中的創(chuàng)建的容器對象
  2. 如果this.WebApplicationContext 不是空,進設(shè)置配置相關(guān)的父容器和刷新容器。
  3. 創(chuàng)建完對應(yīng)的web容器之后,將上面的容器作為該容器的父容器,將rootContext作為父容器,并且同樣進行設(shè)置綁定到對應(yīng)的ServletContext容器中。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容