springboot如何启动web环境
- 当pom.xml里,不依赖spring-boot-starter-web时,
SpringApplication.run(App.class, args);
不会启动tomcat
- 当pom.xml里,依赖spring-boot-starter-web后,
SpringApplication.run(App.class, args);
会启动tomcat
- 为何?
3.1 在springboot启动时,各种refresh会来到

applicationContext的值取决于webApplicationType, 那么webApplicationType的值是关键,webApplicationType在SpringApplication构造方法里被设置,一共有三个类型可选择(REACTIVE, SERVLET, NONE)

重点代码:
this.webApplicationType = WebApplicationType.deduceFromClasspath();
从Classpath里推断webapp的类型

这段代码的主要目的,是以下3点:
a. classpath里有webflux(pom里依赖了,就会扫描加载到),webApplicationType = REACTIVE;不在判断是否有servlet,webflux优先级很高
b. classpath里有servlet(pom里依赖了,就会扫描加载到),webApplicationType = SERVLET;
c. classpath里没有以上两个,webApplicationType = NONE;
搞定了webApplicationType,就可以来搞applicationContext了,


很显然,得到了DEFAULT_SERVLET_WEB_CONTEXT_CLASS作为context,也就是AnnotationConfigServletWebServerApplicationContext
所以呢,在后来的

这里的refresh就会进入

而且,super里的onRefresh()也会进入servletWebServletApplicationContext里

那么好,下面就是最关键,最核心的源码了

这里会创建,启动tomcat,具体我就不在跟进去了,自己看吧。
本文深入探讨SpringBoot中启动Web环境的机制。通过分析pom.xml依赖与SpringApplication.run方法的关系,解释了不同依赖下启动环境的变化。关键在于webApplicationType的推断,它决定了应用上下文类型,从而影响Tomcat的启动。

5040

被折叠的 条评论
为什么被折叠?



