外置Tomcat时,在Tomcat启动时会去找spring-web中META-INF/service/javax.servlet.ServletContainerInitializer中配置的SpringServletContainerInitializer,然后运行其中的onStartup()方法;这是Servlet3开始支持的一种方式。
而SpringBoot是由SpringApplication的run方法作为入口,不会像上面那样去找配置。而是创建了一个类TomcatStarter
class TomcatStarter implements ServletContainerInitializer
所以Tomcat启动时会调用TomcatStarter的onStartup()方法
@Override
public void onStartup(Set<Class<?>> classes, ServletContext servletContext)
throws ServletException {
try {
for (ServletContextInitializer initializer : this.initializers) {
initializer.onStartup(servletContext);
}
}
}
而initializer 在前面已经初始化了,比较难理解的是这里利用了lambda表达式以及匿名内部类,在ServletWebServerApplicationContext中
private void createWebServer() {
WebServer webServer = this