【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理

x33g5p2x  于2022-01-11 转载在 Spring  
字(1.6k)|赞(0)|评价(0)|浏览(233)

前提回顾

之前已经写了很多问斩针对于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容器中。

极限就是为了超越而存在的

相关文章