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. 上下文加载完成 调用所有 CommandLineRunnerrun() 方法
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

这类应用在实际开发中非常实用,比如数据库初始化、日志归档、定时数据同步等场景,建议集合备用。


原始标题:Spring Boot Console Application