1、创建使用外部Servlet容器的Spring Boot的项目,会多一个类。
2、通过外部的tomcat的启动时会发现先启动tomcat,然后就会启动之前Spring Boot的主配置类程序。
3、在Servlet3.0的有几个规范
1)、服务器启动(web应用启动)会创建当前web应用里面每一个jar包里面ServletContainerInitializer实例
2)、ServletContainerInitializer的实现放在jar包的META-INF/services文件夹下,有一个名为javax.servlet.ServletContainerInitializer的文件,内容就是ServletContainerInitializer的实现类的全类名
3)、还可以使用@HandlesTypes,在应用启动的时候加载我们感兴趣的类;
该文件就在spring-web包下
4、在应用启动时就会加载web应用里面每一个jar包里面ServletContainerInitializer实例中的onStartup方法
这里会获得感兴趣的类的实例并遍历调用它们的onStartup方法
5、在ServletContainerInitializer的实现类SpringServletContainerInitializer上有个
@HandlesTypes({WebApplicationInitializer.class}),WebApplicationInitializer就是我们感兴趣的类,查看WebApplicationInitializer接口的子类发现就有我们上面比嵌入式Servlet容器的Spring Boot项目多余出来的ServletInitializer类
6、而我们这个类没有onStartUp方法,进入它父类找到onStartUp方法
主要就是这个createRootApplicationContext方法,我们进入这个方法
7、configure方法ServletInitializer类有这个方法,所以就会调用自己的configure方法,传进去的参数是当前项目的主配置类
8、最后构建出一个SpringApplication对象并调用run方法跑起来。
9、而run方法一路点过去,会发现到了之前我们主配置类启动时调用的run方法,最终我们的SpringBoot应用就启动起来了。
总结:在外部的Servlet的容器启动的时候因为Servlet3.0有个规则就会加载所有感兴趣类中的onStartUp方法,然后调用我们多出来的ServletInitializer类的Configure方法,把当前项目的主配置类传进去,创建出SpringApplication对象并启动SpringBoot应用。最终项目就是tomcat先启动,然后再是Spring Boot项目启动,当然Spring Boot中的功能是一样能用的