springboot怎么关掉tomcat容器

发布时间:2021-11-09 15:50:26 作者:iii
来源:亿速云 阅读:199
# 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'
}

适用场景


方法二:修改启动类配置

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. 方案选择建议 可根据需要调整具体示例的详细程度。

推荐阅读:
  1. Springboot关掉单元测试
  2. Tomcat调优之tomcat容器优化

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

springboot tomcat

上一篇:Android如何实现文件存储

下一篇:Django中的unittest应用是什么

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》