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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 解决Pycharm无法显示matplotlib绘图问题(ubuntu环境)「建议收藏」

    解决Pycharm无法显示matplotlib绘图问题(ubuntu环境)「建议收藏」1.首先,确保环境(虚拟环境)中已经安装了matplotlib模块首先切换到虚拟环境中,然后安装安装命令:condainstallmatplotlib2.确定你的pycharm使用的环境是你的虚拟环境(1)在pycharm中添加虚拟环境pycharm默认使用的环境可能并不是你想用的虚拟环境:如图在file->settings里面可以找到配置虚拟环境的窗口。点1,…

    2022年8月28日
    2
  • C#中DllImport用法汇总

    最近使用DllImport,从网上google后发现,大部分内容都是相同,又从MSDN中搜集下,现将内容汇总,与大家分享。大家在实际工作学习C#的时候,可能会问:为什么我们要为一些已经存在的功能(比如Windows中的一些功能,C++中已经编写好的一些方法)要重新编写代码

    2022年4月9日
    62
  • 香港手机号正则表达式「建议收藏」

    香港手机号正则表达式「建议收藏」刚遇到一个问题,不了解香港手机号的规则,现在记录下来,方便以后查看香港手机号码正则:^([6|9])\d{7}$澳门手机号码正则:^[0][9]\d{8}$大陆:^[1][3-8]\d{9}$正则表达式:^[1][3-8]\d{9}$|^([6|9])\d{7}$|^[6]([8|6])\d{5}$这是规则:大陆:开头13-8号码

    2022年5月4日
    331
  • 计算机病毒的活性,计算机病毒的特性

    计算机病毒的活性,计算机病毒的特性计算机病毒一般具有以下特性:1.计算机病毒的程序性(可执行性)计算机病毒与其他合法程序一样,是一段可执行程序,但它不是一个完整的程序,而是寄生在其他可执行程序上,因此它享有一切程序所能得到的权力。在病毒运行时,与合法程序争夺系统的控制权。计算机病毒只有当它在计算机内得以运行时,才具有传染性和破坏性等活性。也就是说计算机CPU的控制权是关键问题。若计算机在正常程序控制下运行,而不运行带病毒的程序,…

    2022年5月27日
    28
  • 【JavaScript】支持js代码的博客有…

    【JavaScript】支持js代码的博客有…原文地址:支持js代码的博客有哪些?作者:liancaiping1、支持js代码的博客谷歌博客,雅虎奇摩,博客大巴,jimdo博客,和讯博客要等级(230000分).2、现在新浪博客怎么才能有效的使用js呢在新浪博客放广告,现在网络上主要流行的两种方法,这里尽量简单化的给您说明。把广告以代码形式放到免费空间里,然后链接到你的博客教程如下:(1).登陆goog

    2022年7月14日
    11
  • 单例模式与静态方法_静态内部类单例模式原理

    单例模式与静态方法_静态内部类单例模式原理本文主要介绍java的单例模式,以及详细剖析静态内部类之所以能够实现单例的原理。OK,废话不多说,进入正文。首先我们要先了解下单例的四大原则:1.构造私有。2.以静态方法或者枚举返回实例。3.确保实例只有一个,尤其是多线程环境。4.确保反序列换时不会重新构建对象。我们常用的单例模式有:饿汉模式、懒汉模式、双重锁懒汉模式、静态内部类模式、枚举模式,我们来逐一分析下这些模式的…

    2022年10月11日
    0

发表回复

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

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