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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
容器服务 Serverless 版 ACK Serverless,317元额度 多规格
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
简介: 【Spring专场】「MVC容器」不看源码就带你认识核心流程以及运作原理

前提回顾


之前已经写了很多问斩针对于SpringMVC的的执行原理和核心流程,在此再进行冗余介绍就没有任何意义了,所以我们主要考虑的就是针对于SpringMVC还没但大框架有介绍的相关内容解析分析和说明,那么接下来就让我们来接入Spring框架在核心的三大框架之一。



DispatcherServlet的族谱


核心类的继承关系

image.png

核心的主要角色


XXAware的接通


主要用于BeanPostProcessor进行相关的获取系统内部的相关的XX组件功能的实现机制,通过实现该实现类的接口后,就可以非常方便向spring框架索取一些框架信息。



EnvironmentCapable


可以通过该类接口实现机制,进行获取相关的环境变量对象。


HtpServeltBean


是HttpServlet抽象的简单实现接口,以及对于相关的功能的进行一步执行扩展


FrameworkServlet执行类


主要是Spring web框架的一个基础父类,他会在dispatcherServlet创建之前创建一个父容器和自容器之间的关系。


DispatcherServlet实现类


主要是Spring web框架的,也是之前我们文章介绍的核心机制执行流程,它主要用于协调SpringMVC的整体运作流程和执行流程,初始化各个组件机制,比如:HandlerMapping组件、HandlerAdapter组件和HandlerExecuteChain。


借用一个网图(懒得自己在进行画了)image.png



容器的创建过程


主要在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 不是空,进设置配置相关的父容器和刷新容器。


  1. 创建完对应的web容器之后,将上面的容器作为该容器的父容器,将rootContext作为父容器,并且同样进行设置绑定到对应的ServletContext容器中。




相关文章
|
2月前
|
安全 Java 数据库
一天十道Java面试题----第四天(线程池复用的原理------>spring事务的实现方式原理以及隔离级别)
这篇文章是关于Java面试题的笔记,涵盖了线程池复用原理、Spring框架基础、AOP和IOC概念、Bean生命周期和作用域、单例Bean的线程安全性、Spring中使用的设计模式、以及Spring事务的实现方式和隔离级别等知识点。
|
2月前
|
Java
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
这篇文章是Spring5框架的实战教程,深入讲解了AOP的基本概念、如何利用动态代理实现AOP,特别是通过JDK动态代理机制在不修改源代码的情况下为业务逻辑添加新功能,降低代码耦合度,并通过具体代码示例演示了JDK动态代理的实现过程。
Spring5入门到实战------9、AOP基本概念、底层原理、JDK动态代理实现
|
20天前
|
缓存 Java 开发工具
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
三级缓存是Spring框架里,一个经典的技术点,它很好地解决了循环依赖的问题,也是很多面试中会被问到的问题,本文从源码入手,详细剖析Spring三级缓存的来龙去脉。
Spring是如何解决循环依赖的?从底层源码入手,详细解读Spring框架的三级缓存
|
20天前
|
缓存 安全 Java
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
从底层源码入手,通过代码示例,追踪AnnotationConfigApplicationContext加载配置类、启动Spring容器的整个流程,并对IOC、BeanDefinition、PostProcesser等相关概念进行解释
Spring框架中Bean是如何加载的?从底层源码入手,详细解读Bean的创建流程
|
20天前
|
XML 缓存 Java
手写Spring源码(简化版)
Spring包下的类、手写@ComponentScan注解、@Component注解、@Autowired注解、@Scope注解、手写BeanDefinition、BeanNameAware、InitializingBean、BeanPostProcessor 、手写AnnotationConfigApplicationContext
手写Spring源码(简化版)
|
4天前
|
缓存 Java Spring
手写Spring Ioc 循环依赖底层源码剖析
在Spring框架中,IoC(控制反转)是一个核心特性,它通过依赖注入(DI)实现了对象间的解耦。然而,在实际开发中,循环依赖是一个常见的问题。
13 4
|
9天前
|
XML 缓存 Java
spring源码剖析-spring-beans(内部核心组件,BeanDefinition的注册,BeanWapper创建)
spring源码剖析-spring-beans(内部核心组件,BeanDefinition的注册,BeanWapper创建)
38 10
|
9天前
|
XML 存储 Java
spring源码刨析-spring-beans(内部核心组件,beanDefinition加载过程)
spring源码刨析-spring-beans(内部核心组件,beanDefinition加载过程)
|
9天前
|
XML 存储 Java
Spring-源码深入分析(二)
Spring-源码深入分析(二)
|
9天前
|
XML 设计模式 Java
Spring-源码深入分析(一)
Spring-源码深入分析(一)
下一篇
无影云桌面