写点什么

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

作者:浩宇天尚
  • 2022 年 1 月 10 日
  • 本文字数:1227 字

    阅读完需:约 4 分钟

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

前提回顾


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

发布于: 刚刚阅读数: 2
用户头像

浩宇天尚

关注

🏆 InfoQ写作平台-签约作者 🏆 2020.03.25 加入

【个人简介】酷爱计算机科学、醉心编程技术、喜爱健身运动、热衷悬疑推理的“极客达人” 【技术格言】任何足够先进的技术都与魔法无异 【技术范畴】Java领域、Spring生态、MySQL专项、微服务/分布式体系和算法设计等

评论

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