1、查询JSR的Servlet规范,一个接口(ServletContainerInitializer)处理@HandlesTypes中所有类,也就是通过加载ServletContainerInitializer,会加载@HandlesTypes中所有感兴趣的类,调用感兴趣类的onStartup方法。
2、Spring在类路径下指定了ServletContainerInitializer的SPI实现
3、Tomcat启动,会通过SPI加载Spring指定的类
4、通过Servlet规范,最终是会加载@HandlesTypes注解中的所有类
5、因此我们只需要实现这个WebApplicationInitializer接口,当tomcat启动的时候就会自动调用onStartup方法(这里可以自定义,可以在启动的时候做一些自己的事情,反正Spring在onStartup做了很多事情,比如创建IOC容器,创建DispatcherServlet等)
6、onStartup方法中:准备空的IOC容器,创建了DispatcherServlet
7、tomcat启动的时候,会为每一个Servlet创建对象,会自动调用每个Servlet.init()方法(这属于tomcat的机制,同时DispatcherServlet是一个Servlet)
8、然后开始走servlet的init整个流程
-------------------------------------------------------------------------------
为了防止太多而导致比较乱,这里分开两部分
上面主要介绍Servlet规范、Tomcat利用SPI加载Spring目录下的自定义组件、Spring开始逐渐工作(创建IOC容器、DispatcherServlet)
-------------------------------------------------------------------------------
(DispatcherServlet的init创建)
9、查看DispatcherServlet的继承树
10、DispatcherServlet的init初始化,在初始化的过程中就开始刷新容器的,至此Spring、SpringMVC父子容器的onRefresh就刷新完毕(就在servlet.init方法之中),ss就算启动了。
11、Spring的OnRefresh是十二大步,SpringMVC的OnRefresh是初始化九大组件
总结:
1、找到Servlet规范,知道了@HandlesTypes加载感兴趣的类
2、Tomcat利用SPI机制,加载Spring目录下对Servlet规范实现的一个实现类
3、Spring注册DispatcherServlet(一个Servlet)
4、Tomcat启动机制,启动之后自动调用所有Servlet的init方法
5、DispatcherServlet.init方法中刷新了Spring、SpringMVC容器,使得整个项目启动