SpringMVC启动流程

111 阅读2分钟

这是我参与11月更文挑战的第4天,活动详情查看:2021最后一次更文挑战

分享下SpringMVC相关知识点速记

预备知识

首先需要了解下tomcat和spring这些是怎么整合在一起的

  • tomcat中可以有多个app,tomcat启动的时候会依次加载里面的app。

    • 每个app都有一个WebApp ClassLoader,和一个ServletContext。
    • ServletContext启动时,会扫描web.xml配置文件,找到Filter、Listener和Servlet配置
  • tomcat这类serlvet容器,遵循servlet规范的话,web应用在容器启动前需要依次执行下面步骤:【重要核心】

    • 创建和初始化web.xml 里面的listener事件监听器。尤其实现了ServletContextListener接口的,会调用其contextInitialized方法。

    • 创建和初始化web.xml 里面配置的filter。并调用其init方法。

    • 创建和初始化web.xml 里面配置的servlet,并调用其init方法。

    • img

  • servlet3.0 基于spi机制,不需要再用xml了。但是tomcat必须是7以上。

具体流程

  • tomcat启动之后会加载ServletContext上下文对象。这是Servlet全局共享的一个上下文对象。

  • ServletContext会先初始化和加载web.xml里面配置listener,如果listener是ServletContextListener实现类,会调用contextInitialized方法。而我们会配置ContextLoaderListener,这样初始化该listener就会创建一个WebApplicationContext这样的IOC容器。此时Spring的IOC容器就创建完成。(这是一个父容器,并且该容器会set进ServletContext中)。

  • 然后ServletContext会接着加载和初始化filter(跳过)

  • 然后接着初始化servlet!而SpringMVC只有一个DispatcherServlet。所以会调用其init方法。

  • init方法也会创建一个WebApplicationContext这样的IOC子容器(和父是一样的,子容器中管理的Bean一般只被该Servlet使用),并会将Spring的IOC容器设置为父容器(子可以访问父容器的bean,但是父不能访问子的)

  • 然后会调用容器的onRefresh方法,将SpringMVC核心九大组件都加载进去。

  • 此时SpringMVC加载完毕。

  • 核心2大块:img

  • 参考