如何切换
1、排除 web 场景 starter ( spring-boot-starter-web )的 tomcat 依赖。
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<exclusions>
<exclusion>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</exclusion>
</exclusions>
</dependency>
2、导入其他服务器的场景 ( starter )
undertow
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
netty (启动时报错)
<dependency>
<groupId>io.netty</groupId>
<artifactId>netty-all</artifactId>
</dependency>
jetty (启动时报错)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jetty</artifactId>
</dependency>
原理分析
嵌入式 Servlet 容器给我们的第一印象就是:我们创建一个 Spring Boot 应用的时候,我们无需外置部署服务器,应用里已经自带了服务器,应用一启动,服务器也跟着启动了。
Spring Boot 应用默认启动的嵌入式 Servlet 容器就是 Tomcat。
在官方文档里,对原理进行了简答的解释。
在底层,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 。