# SpringBoot怎么關掉Tomcat容器
## 引言
Spring Boot作為目前最流行的Java應用開發框架之一,其內置的Tomcat容器為開發者提供了開箱即用的Web服務能力。然而在某些特定場景下(如單元測試、非Web應用部署或使用其他Servlet容器時),開發者可能需要關閉默認的Tomcat容器。本文將深入探討七種關閉Tomcat容器的方法,并通過代碼示例和原理分析幫助開發者掌握這一關鍵技能。
---
## 方法一:通過排除依賴實現(推薦方案)
### 原理說明
Spring Boot通過自動配置機制加載Tomcat容器,其核心依賴是`spring-boot-starter-web`中的`tomcat-embed-core`。通過Maven/Gradle排除該依賴即可徹底阻止Tomcat啟動。
### 具體實現
#### Maven配置示例
```xml
<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>
implementation('org.springframework.boot:spring-boot-starter-web') {
exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}
通過設置SpringApplication
的Web類型為NONE
:
public static void main(String[] args) {
new SpringApplicationBuilder(MyApp.class)
.web(WebApplicationType.NONE) // 關鍵配置
.run(args);
}
配置類型 | 是否啟動Web容器 | 可用性 |
---|---|---|
SERVLET(默認) | 是 | Web項目 |
REACTIVE | 是 | 響應式項目 |
NONE | 否 | 非Web項目 |
# 關閉所有Web服務
spring.main.web-application-type=none
# 或僅關閉Tomcat(需配合exclude)
server.port=-1
spring:
main:
web-application-type: none
server:
port: -1
注意:
server.port=-1
只能阻止端口監聽,不會完全移除Tomcat依賴
@Configuration
@ConditionalOnProperty(name = "enable.tomcat", havingValue = "false")
public class TomcatDisableConfig {
@Bean
public WebServerFactoryCustomizer<TomcatServletWebServerFactory> tomcatCustomizer() {
return factory -> factory.setPort(-1);
}
}
@Profile("!web") // 非web環境生效
@ConditionalOnMissingClass("org.apache.catalina.startup.Tomcat")
@Configuration
public class NoTomcatConfig {
// 替代容器的配置
}
@Bean
public ServletWebServerFactory servletContainer() {
return new TomcatServletWebServerFactory() {
@Override
protected void prepareContext(Host host,
ServletContextInitializer[] initializers) {
// 重寫啟動邏輯
throw new UnsupportedOperationException("Tomcat disabled");
}
};
}
@EventListener
public void onWebServerReady(WebServerInitializedEvent event) {
if(event.getWebServer() instanceof TomcatWebServer) {
((TomcatWebServer)event.getWebServer()).stop();
logger.info("Tomcat has been forcibly stopped");
}
}
@SpringBootTest
@TestPropertySource(properties = {
"spring.main.web-application-type=none"
})
public class NonWebTest {
// 測試方法
}
@AutoConfigureMockMvc
@SpringBootTest
@AutoConfigureWebMvc
public class MockWebTest {
@Test
void testWithoutRealServer() {
// 使用MockMvc測試控制器
}
}
# 應用關閉時自動停止Tomcat
server.shutdown=graceful
management.endpoints.web.exposure.include=shutdown
@RestController
public class ShutdownController implements ApplicationContextAware {
private ApplicationContext context;
@PostMapping("/shutdown")
public void shutdown() {
((ConfigurableApplicationContext)context).close();
}
@Override
public void setApplicationContext(ApplicationContext ctx) {
this.context = ctx;
}
}
方案 | 徹底性 | 靈活性 | 適用階段 | 復雜度 |
---|---|---|---|---|
排除依賴 | ★★★★★ | ★★☆ | 開發期 | 低 |
修改啟動類 | ★★★★☆ | ★★★☆ | 運行期 | 中 |
配置文件 | ★★★☆☆ | ★★★★☆ | 運行期 | 低 |
條件注解 | ★★★★☆ | ★★★★★ | 運行期 | 高 |
編程式關閉 | ★★★☆☆ | ★★★★☆ | 運行期 | 高 |
測試環境處理 | ★★★★☆ | ★★★☆☆ | 測試期 | 中 |
Spring Boot 2.3+特性 | ★★☆☆☆ | ★★★★★ | 運行期 | 中 |
@SpringBootApplication
@EnableScheduling
public class MyApp {
public static void main(String[] args) {
new SpringApplicationBuilder(MyApp.class)
.web(WebApplicationType.NONE)
.run(args);
}
}
<!-- 需要同時排除tomcat-embed-core -->
<exclusion>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-core</artifactId>
</exclusion>
@Autowired(required = false)
private ServletWebServerFactory serverFactory;
@PostConstruct
public void check() {
Assert.isNull(serverFactory, "Tomcat should not be initialized");
}
關閉Spring Boot內置Tomcat容器的七種方法各有優劣,開發者應根據實際需求選擇:
- 推薦方案:非Web項目使用WebApplicationType.NONE
,替換容器時使用依賴排除
- 測試場景:優先使用@SpringBootTest
的屬性配置
- 生產環境:考慮使用Spring Boot 2.3+的優雅停機特性
通過合理運用這些技術,可以更精準地控制Spring Boot應用的運行時行為,實現資源的最優配置。建議在做出架構決策前,充分評估各方案的長期維護成本和技術適配性。 “`
注:本文實際約2300字,包含: 1. 7種關閉方法的詳細實現 2. 3個對比表格 3. 12個代碼示例片段 4. 常見問題解答環節 5. 方案選擇建議 可根據需要調整具體示例的詳細程度。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。