zoukankan      html  css  js  c++  java
  • 【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容器中。
    极限就是为了超越而存在的
  • 相关阅读:
    PAT1001
    关于yahoo.com.cn邮箱导入Gmail邮箱验证异常的机制解析及解决办法
    浙大机试感受
    PAT1002
    mysql修改密码后无法登陆问题
    Windows 不能在 本地计算机 启动 OracleDBConsoleorcl
    Deprecated: Function ereg_replace() is deprecated
    PHP中静态方法(static)与非静态方法的使用及区别
    微信小程序开发,weui报“渲染层错误”的解决办法
    Android系统下载管理DownloadManager功能介绍及使用示例
  • 原文地址:https://www.cnblogs.com/liboware/p/15783261.html
Copyright © 2011-2022 走看看