spring源码分析-spring与tomcat整合原理

spring源码分析-spring与tomcat整合原理

spring与tomcat整合的整理的流程图如下:
在这里插入图片描述

流程图解析:

1.SPI机制:tomcat启动时会通过SPI的机制加载所有包下面的META-INF/services/javax.servlet.ServletContainerInitializer,读取里面的内容(里面是一个实现了ServletContainerInitializer的类全路径)。此时tomcat就会实例化该全路径的类,然后调用onStartup()这就是spring和tomcat整合的入口,这种spi机制使用的非常广泛,比如springboot原理、数据库驱动等

2.onStartup方法是读取类上的@HandlerTypes里面的接口的所有实现类,然后调用实现类的onStartup方法

3.创建父容器:创建父容器是在流程3中创建,此时仅仅是创建,并没有调用核心方法,调用核心方法的时机是后面触发监听器,调用监听器ContextLoadListener的contextInitialized()即流程9

4.创建子容器:父容器创建之后,就开始创建子容器对应流程6,此时也仅仅是创建而已,并没有调用核心方法refresh,真正的调用刷新方法是在dispatcherservlet调用init方法内,即流程13

什么是父容器和子容器

父容器:即springcontext,一般是用来创建和维护公共的一些bean,比如dao等

子容器:mvccontext,一般用来创建和维护web相关的bean,比如controller

为什么需要设计父子容器:一般是为了规范,如果你区分项目也是能正常运行的

5.父容器刷新:spring中ContextLoaderListener监听器实现了servlet的ServletContextListener,servlet初始化会调用监听器contextInitialized方法,所以会调用到ContextLoaderListener.contextInitialized()

6.子容器刷新:servlet规范中,当一个servlet创建后会调用其init()方法,因此会调用DispathcerServlet.init(),其实现逻辑在父类HttpServletBean中,子容器刷新就是在该方法中实现

7.事件监听机制:上述父子容器刷新会调用onRefresh()这个就是spring的核心方法了,相信大家都比较熟悉,完成了所有的bean的实例化,并且放入到IOC容器中。在onRefresh()中会将拿到所有ApplicationListener的实现类,并且当spring容器初始化完成后,会调用其onApplicationEvent()方法,其实就是监听者设计模式。然而在FrameworkServlet中就有个内部类ContextRefreshListener实现了ApplicationListener,因此会调用onApplicationEvent()方法,如下所示:

/** * ApplicationListener endpoint that receives events from this servlet's WebApplicationContext * only, delegating to {@code onApplicationEvent} on the FrameworkServlet instance. */
private class ContextRefreshListener implements ApplicationListener<ContextRefreshedEvent> {
   

   @Override
   public void onApplicationEvent(ContextRefreshedEvent event) {
   
      FrameworkServlet.this.onApplicationEvent(event);
   }
}

然后就会调用到如下的方法

/** * This implementation calls {@link #initStrategies}. */
@Override
protected void onRefresh(ApplicationContext context) {
   
   initStrategies(context);
}

/** * Initialize the strategy objects that this servlet uses. * <p>May be overridden in subclasses in order to initialize further strategy objects. */
protected void initStrategies(ApplicationContext context) {
   
   initMultipartResolver(context);
   initLocaleResolver(context);
   initThemeResolver(context);
   initHandlerMappings(context);
   initHandlerAdapters(context);
   initHandlerExceptionResolvers(context);
   initRequestToViewNameTranslator(context);
   initViewResolvers(context);
   initFlashMapManager(context);
}

到这里需要初始化web的一些资源了,下面就不再继续跟了,感兴趣的可以继续了解。本文是大概梳理了一下spring与tomcat结合的流程,希望对大家有帮助。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/111200.html原文链接:https://javaforall.net

(0)
上一篇 2021年8月4日 上午9:00
下一篇 2021年8月4日 上午9:23


相关推荐

  • 为什么要用 Bootstrap

    [Bootstrap](http://hovertree.com/menu/bootstrap/)是由两个twitter员工开发并开源的前端框架,非常火爆,而如此火爆自然有它的道理,在我们团队的

    2021年12月26日
    46
  • Linux查找文件位置

    Linux查找文件位置目标在 Linux 中查找某个文件是否存在 并确定其位置 locate 方法 locate 从系统数据库查找文件 因此速度很快 当文件 夹 包含查找名称时就会被列出 比如查找 libopencv 的位置 locateopencv 注意 如果查找近期删除了的文件 但数据库未更新 就可能仍然找到该文件被删除前的路径 可以通过以下指令更新数据库 sudoupdatedb 方法我最常用的方法 find 将遍历磁盘 因此速度比 locate 慢 但不会找到近期被删除的文件 用法 findpath na

    2026年3月19日
    2
  • u检验、t检验、F检验、卡方检验详细分析

    u检验、t检验、F检验、卡方检验详细分析要点 一 正态分布是统计学的基础 它对于各种假设检验极其的重要 t 分布 F 分布 卡方分布都是基于正态分布衍生出来的 而且中心极限定理也证明了 多数分布在样本量 n 足够大的情况下 其样本均值服从正态分布 二 假设检验的步骤 1 提出假设 包括无效假设 H0 和备择假设 H1 2 预设检验水准 一般设为 0 05 概率小于 0 05 为小概率事件 3 选定检

    2026年3月19日
    2
  • 最好用的mysql 管理工具_汽车行业质量管理五大工具

    最好用的mysql 管理工具_汽车行业质量管理五大工具对于数据库运维人员来说,想要保证数据库在高效平稳的运行就有点像杂技演员在转盘子,需要灵活、专注、能快速做出反应、并且拥有冷静的头脑。数据库几乎是所有能够成功运行系统的核心。而数据库运维人员对组织的数据… 对于数据库运维人员来说,想要保证数据库在高效平稳的运行就有点像杂技演员在转盘子,需要灵活、专注、能快速做出反应、并且拥有冷静的头脑。数据库几乎是所有能够成功运行系统的核心。而数据库运维人员对组织的数据负责,能找到可依靠的工具来更加高效的管理数据库,并且轻松的维护日常的工作就变得格外重要。数据库运维人

    2022年8月22日
    7
  • 一分钟学会Python中pip的安装与使用

    一分钟学会Python中pip的安装与使用文章目录一、简单介绍二、下载安装三、最常用命令1、显示版本和路径2、获取帮助3、升级pip4、安装包5、升级包6、卸载包7、搜索包8、显示安装包信息9、列出已安装的包10、查看指定包的详细信息一、简单介绍pip是Python包管理工具,该工具提供了对Python包的查找、下载、安装和卸载的功能,现在大家用到的所有包不是自带的就是通过pip安装的。Python2.7.9+或Python3.4+以上版本都自带pip工具。给出pip官网链接:pip官网。二、下载安装可以通过命令

    2022年4月30日
    88
  • iconst、bipush、sipush、ldc指令的区别

    iconst、bipush、sipush、ldc指令的区别文章目录 1 前言 2 iconst3 bipush4 sipush5 ldc 转载 1 前言 JVM 中 int 类型数值 根据取值范围将入栈的字节码指令就分为 4 类 取值 1 5 采用 iconst 指令 取值 128 127 采用 bipush 指令 取值 32768 32767 采用 sipush 指令 取值 采用 ldc 指令 2 iconst 当 int 取值 1 5 时 JVM 采用 iconst 指令将常量压入栈中 定义 Test ja

    2026年3月26日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号