溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

springboot怎么關掉tomcat容器

發布時間:2021-11-09 15:50:26 來源:億速云 閱讀:229 作者:iii 欄目:開發技術
# 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>

Gradle配置示例

implementation('org.springframework.boot:spring-boot-starter-web') {
    exclude group: 'org.springframework.boot', module: 'spring-boot-starter-tomcat'
}

適用場景

  • 需要完全移除Tomcat依賴
  • 項目將使用其他Servlet容器(如Jetty、Undertow)

方法二:修改啟動類配置

WebApplicationType切換

通過設置SpringApplication的Web類型為NONE

public static void main(String[] args) {
    new SpringApplicationBuilder(MyApp.class)
        .web(WebApplicationType.NONE) // 關鍵配置
        .run(args);
}

效果對比

配置類型 是否啟動Web容器 可用性
SERVLET(默認) Web項目
REACTIVE 響應式項目
NONE 非Web項目

方法三:配置文件控制

application.properties配置

# 關閉所有Web服務
spring.main.web-application-type=none

# 或僅關閉Tomcat(需配合exclude)
server.port=-1

application.yml配置

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 {
    // 替代容器的配置
}

方法五:編程式關閉

實現ServletWebServerFactory接口

@Bean
public ServletWebServerFactory servletContainer() {
    return new TomcatServletWebServerFactory() {
        @Override
        protected void prepareContext(Host host, 
            ServletContextInitializer[] initializers) {
            // 重寫啟動邏輯
            throw new UnsupportedOperationException("Tomcat disabled");
        }
    };
}

使用WebServerInitializedEvent

@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 {
    // 測試方法
}

Mock環境配置

@AutoConfigureMockMvc
@SpringBootTest
@AutoConfigureWebMvc
public class MockWebTest {
    @Test
    void testWithoutRealServer() {
        // 使用MockMvc測試控制器
    }
}

方法七:Spring Boot 2.3+新特性

優雅停機配置

# 應用關閉時自動停止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+特性 ★★☆☆☆ ★★★★★ 運行期

常見問題解答

Q1:關閉Tomcat后如何保證定時任務繼續運行?

@SpringBootApplication
@EnableScheduling
public class MyApp {
    public static void main(String[] args) {
        new SpringApplicationBuilder(MyApp.class)
            .web(WebApplicationType.NONE)
            .run(args);
    }
}

Q2:已排除Tomcat但出現ClassNotFound異常?

<!-- 需要同時排除tomcat-embed-core -->
<exclusion>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-core</artifactId>
</exclusion>

Q3:如何驗證Tomcat確實已關閉?

@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. 方案選擇建議 可根據需要調整具體示例的詳細程度。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女