这是我参与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方法。
-
-
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大块:
-
参考