spring-boot - 从源码讨论SpringApplication的run方法是否会执行两次
问题描述
看了下springboot的源码,感觉SpringApplication的run方法会执行两次。第一次,当你执行下面的代码
public static void main(String[] args) {
SpringApplication.run(HppaApplication.class, args);
}
第二次,Servlet3.0在指定web容器启动的时候会去实现类中回调ServletContainerInitializer的onStartup方法,并通过@HandlesTypes进入对应的实现类,最后在调用SpringBootServletInitializer的onStartup方法,这个方法调用createRootApplicationContext方法,下面代码中的CreateRootApplicationContext方法
protected WebApplicationContext createRootApplicationContext(ServletContext servletContext) {
// Omit other code
return run(application);
}
再次执行 SpringApplication 的 run 方法。为什么要执行这个方法两次?
解决方案
它没有被调用两次。main 方法仅在作为独立应用程序运行时使用。调用 viaSpringBootServletInitializer
仅在部署到 servlet 容器时使用。