如何切换

1、排除 web 场景 starter ( spring-boot-starter-web )的 tomcat 依赖。

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-web</artifactId>
  4. <exclusions>
  5. <exclusion>
  6. <groupId>org.springframework.boot</groupId>
  7. <artifactId>spring-boot-starter-tomcat</artifactId>
  8. </exclusion>
  9. </exclusions>
  10. </dependency>

2、导入其他服务器的场景 ( starter )
undertow

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-undertow</artifactId>
  4. </dependency>

netty (启动时报错)

  1. <dependency>
  2. <groupId>io.netty</groupId>
  3. <artifactId>netty-all</artifactId>
  4. </dependency>

jetty (启动时报错)

  1. <dependency>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-jetty</artifactId>
  4. </dependency>

原理分析

官方文档位置:https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-features-embedded-container-application-context

嵌入式 Servlet 容器给我们的第一印象就是:我们创建一个 Spring Boot 应用的时候,我们无需外置部署服务器,应用里已经自带了服务器,应用一启动,服务器也跟着启动了。

Spring Boot 应用默认启动的嵌入式 Servlet 容器就是 Tomcat。

在官方文档里,对原理进行了简答的解释。
image.png

在底层,Spring Boot 使用了不同类型的 ApplicationContext 来支持嵌入式的 servlet 容器。

ServletWebServerApplicationContext 是一种特殊类型的 WebApplicationContext,它通过搜索单个ServletWebServerFactory bean 来引导自身。

通常,TomcatServletWebServerFactory、JettyServletWebServerFactory 或 UndertowServletWebServerFactory 是自动配置的。

Spring Boot 应用启动,发现当前是 web 应用,web 的场景包里有 tomcat ,也导入了 tomcat。
web 应用会创建一个 web 版的 IOC 容器,这个容器的名字就叫 ServletWebServerApplicationContext 。
ServletWebServerApplicationContext 会在启动的时候寻找 ServletWebServerFactory 来自动配置 Servlet Web 服务器,通常来说,最经常用的 ServletWebServerFactory 是:TomcatServletWebServerFactory,JettyServletWebServerFactory,UndertowServletWebServerFactory 。