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 但不启动服务,代码控制更合适;如果需要环境隔离,那就用配置文件吧。