1. 引言

Spring Boot 是一个非常强大的框架,能快速搭建各种类型的 Java 应用。虽然它最广为人知的用途是作为 Web 服务器(通过内嵌的 Tomcat、Jetty 等容器和模板引擎),但实际上 Spring Boot 还有很多非 Web 场景的应用,比如:

  • 控制台应用(Console Applications)
  • 定时任务调度
  • 批处理(Batch Processing)
  • 流式处理(Stream Processing)
  • Serverless 函数计算(如 Spring Cloud Function)

在本文中,我们将介绍几种 在不启动 Web 服务器的前提下使用 Spring Boot 的方式,帮助你在合适场景下更灵活地使用这个框架。


2. 依赖控制法:从源头杜绝 Web 依赖

最简单粗暴的方式就是 不要引入 Web 相关的 Starter 依赖

❌ 不要引入:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
</dependency>

✅ 而是使用基础依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

⚠️ 注意:有时候即使你没主动加 spring-boot-starter-web,也可能因为其他依赖(如监控组件、测试工具)而引入了 Tomcat 等 Web 容器的传递依赖。这时就需要手动排除:

<dependency>
    <groupId>some.other.library</groupId>
    <artifactId>some-library</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.apache.tomcat.embed</groupId>
            <artifactId>tomcat-embed-core</artifactId>
        </exclusion>
    </exclusions>
</dependency>

3. 编程方式显式关闭 Web 服务

如果你仍然希望保留 Servlet 和容器 API(比如用于测试或自定义逻辑),但又不想启动 Web 服务器,可以通过代码方式设置:

方法一:使用 SpringApplicationBuilder

new SpringApplicationBuilder(MainApplication.class)
  .web(WebApplicationType.NONE)
  .run(args);

方法二:配置 SpringApplication 实例

SpringApplication application = new SpringApplication(MainApplication.class);
application.setWebApplicationType(WebApplicationType.NONE);
application.run(args);

✅ 优点:可以保留 Web 相关类库,但不启动服务,适合需要复用 Web API 的场景。


4. 配置文件控制 Web 模式

如果希望 根据环境动态控制是否启用 Web 服务,可以通过配置文件来实现。

application.properties 配置:

spring.main.web-application-type=none

或者使用 YAML 格式:

spring:
  main:
    web-application-type: none

✅ 优点:支持动态控制,配合 Profile 或条件注解(如 @ConditionalOnProperty)可实现不同环境不同行为。

例如,开发环境开启 Web 服务用于暴露监控接口,而生产环境关闭以增强安全性。

⚠️ 注意:早期版本使用的是布尔值属性 web-environment,但在引入响应式容器支持后,已废弃并改为枚举类型 web-application-type


5. 总结

虽然 Spring Boot 常被用于构建 Web 应用,但它同样适用于很多 非 Web 场景。通过合理选择依赖、编程控制或配置文件,我们可以轻松地构建一个 不启动 Web 服务器的 Spring Boot 应用

方式 是否保留 Web API 是否支持动态控制 适用场景
移除 Web 依赖 纯控制台、批处理任务
编程控制 需要复用 Web API
配置文件控制 多环境部署、动态开关

选择哪种方式,取决于你的实际需求。如果你只是想跑个定时任务或批处理作业,移除 Web 依赖最省事;如果你希望保留 API 但不启动服务,代码控制更合适;如果需要环境隔离,那就用配置文件吧。


原始标题:Spring Boot Without A Web Server