1. 概述
本文将带你快速上手如何使用 Spring Boot 构建一个简单的控制台(Console)应用程序。这类应用适用于定时任务、数据批处理、脚本化运维等场景,无需启动 Web 容器,轻量高效。
✅ 适合用于 CLI 工具、后台作业、初始化脚本等非 Web 场景
⚠️ 如果你误当成 Web 项目启动,会默认加载 Tomcat,白白浪费资源
2. Maven 依赖配置
项目需继承 Spring Boot 的官方父工程,确保依赖版本统一管理:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.1.5</version>
<relativePath/>
</parent>
核心依赖只需引入 spring-boot-starter
,它包含了 Spring Core、上下文、自动配置等基础模块:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
✅ 不需要添加 spring-boot-starter-web
,否则会默认启动 Web 环境
✅ 控制台应用应尽量精简依赖,避免不必要的 Bean 被加载
3. 编写控制台主类
控制台应用通常只有一个主类,负责启动 Spring 容器并执行逻辑。关键点如下:
- 使用
@SpringBootApplication
注解启用自动配置和组件扫描 - 实现
CommandLineRunner
接口,在容器初始化完成后自动执行run()
方法 - 显式声明应用类型为非 Web(避免踩坑!)
核心代码示例
@SpringBootApplication
public class SpringBootConsoleApplication implements CommandLineRunner {
private static final Logger LOG = LoggerFactory.getLogger(SpringBootConsoleApplication.class);
public static void main(String[] args) {
LOG.info("STARTING THE APPLICATION");
SpringApplication.run(SpringBootConsoleApplication.class, args);
LOG.info("APPLICATION FINISHED");
}
@Override
public void run(String... args) {
LOG.info("EXECUTING : command line runner");
for (int i = 0; i < args.length; ++i) {
LOG.info("args[{}]: {}", i, args[i]);
}
}
}
配置非 Web 应用类型
在 application.properties
中添加:
spring.main.web-application-type=NONE
或者通过 Java 配置方式:
public static void main(String[] args) {
SpringApplication app = new SpringApplication(SpringBootConsoleApplication.class);
app.setWebApplicationType(WebApplicationType.NONE);
app.run(args);
}
✅ 必须设置 web-application-type=NONE
,否则 Spring Boot 会尝试启动嵌入式容器
❌ 忽略此配置会导致启动失败或浪费资源(尤其在无 Servlet 容器环境中)
4. 执行结果与生命周期分析
运行程序并传入参数 "Hello World!"
,输出日志如下:
00:48:51.888 [main] INFO c.b.s.SpringBootConsoleApplication - STARTING THE APPLICATION
00:48:52.752 [main] INFO c.b.s.SpringBootConsoleApplication - No active profile set, falling back to default profiles: default
00:48:52.851 [main] INFO o.s.c.a.AnnotationConfigApplicationContext
- Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6497b078: startup date [Sat Jun 16 00:48:52 IST 2018]; root of context hierarchy
00:48:53.832 [main] INFO o.s.j.e.a.AnnotationMBeanExporter - Registering beans for JMX exposure on startup
00:48:53.854 [main] INFO c.b.s.SpringBootConsoleApplication - EXECUTING : command line runner
00:48:53.854 [main] INFO c.b.s.SpringBootConsoleApplication - args[0]: Hello World!
00:48:53.860 [main] INFO c.b.s.SpringBootConsoleApplication - Started SpringBootConsoleApplication in 1.633 seconds (JVM running for 2.373)
00:48:53.860 [main] INFO c.b.s.SpringBootConsoleApplication - APPLICATION FINISHED
00:48:53.868 [Thread-2] INFO o.s.c.a.AnnotationConfigApplicationContext
- Closing org.springframework.context.annotation.AnnotationConfigApplicationContext@6497b078: startup date [Sat Jun 16 00:48:52 IST 2018]; root of context hierarchy
00:48:53.870 [Thread-2] INFO o.s.j.e.a.AnnotationMBeanExporter - Unregistering JMX-exposed beans on shutdown
生命周期关键节点 ✅
阶段 | 触发动作 |
---|---|
1. main() 开始 |
打印“STARTING”日志 |
2. SpringApplication.run() |
初始化上下文、执行自动配置 |
3. 上下文加载完成 | 调用所有 CommandLineRunner 的 run() 方法 |
4. run() 执行完毕 |
继续执行 main() 剩余代码(如“APPLICATION FINISHED”) |
5. JVM 退出前 | 自动关闭上下文,释放资源 |
⚠️ 注意:run()
方法执行时,Spring 容器已完全就绪,可安全注入其他 Bean
5. 多 Runner 场景与执行顺序控制
若项目中存在多个 CommandLineRunner
实现类,Spring Boot 默认按 Bean 注册顺序执行。如需指定优先级,使用 @Order
注解:
@Component
@Order(1)
public class FirstRunner implements CommandLineRunner {
@Override
public void run(String... args) {
LOG.info("First to run");
}
}
@Component
@Order(2)
public class SecondRunner implements CommandLineRunner {
@Override
public void run(String... args) {
LOG.info("Second to run");
}
}
✅ 推荐在复杂批处理流程中使用该机制控制执行顺序
❌ 避免在 run()
中阻塞主线程,除非是守护类任务
6. 总结
Spring Boot 提供了极简方式构建控制台应用,核心要点总结如下:
- ✅ 使用
@SpringBootApplication + CommandLineRunner
模式 - ✅ 显式设置
spring.main.web-application-type=NONE
避免启动 Web 容器 - ✅ 利用
@Order
控制多个 Runner 的执行顺序 - ✅ 支持命令行参数传递,便于脚本化调用
- ✅ 完整的 Spring 生态支持(DI、AOP、Profile、外部化配置等)
完整示例代码已托管至 GitHub:https://github.com/techblog/spring-boot-console-demo
这类应用在实际开发中非常实用,比如数据库初始化、日志归档、定时数据同步等场景,建议集合备用。