CommandLineRunner和ApplicationRunner的作用和使用示例

2025-09-08 09:48:06 / c罗世界杯图片

CommandLineRunner 和 ApplicationRunner 是 Spring Boot 提供的两个接口,用于在 Spring 应用程序启动后执行特定的代码逻辑。它们的主要区别在于对命令行参数的处理方式。以下是对这两个接口的详细介绍:

1. CommandLineRunner

定义

CommandLineRunner 是一个简单的接口,定义了一个 run 方法,该方法会在 Spring 应用程序的上下文完全加载后执行。它接收原始的命令行参数数组 String... args 作为输入。

接口定义

public interface CommandLineRunner {

void run(String... args) throws Exception;

}

特点

简单易用:直接接收原始的命令行参数数组。

适合场景:适用于简单的初始化任务,如打印日志、加载初始数据等。

使用示例

import org.springframework.boot.CommandLineRunner;

import org.springframework.stereotype.Component;

@Component

public class MyCommandLineRunner implements CommandLineRunner {

@Override

public void run(String... args) throws Exception {

System.out.println("CommandLineRunner: 应用程序已启动!");

System.out.println("命令行参数: " + String.join(", ", args));

}

}

运行结果

如果启动应用时传入了命令行参数 --arg1 value1 --arg2 value2,输出结果为:

CommandLineRunner: 应用程序已启动!

命令行参数: --arg1, value1, --arg2, value2

2. ApplicationRunner

定义

ApplicationRunner 是一个更高级的接口,也定义了一个 run 方法,但在参数处理方面提供了更丰富的功能。它接收一个 ApplicationArguments 对象,该对象可以解析命令行参数并提供更灵活的访问方式。

接口定义

public interface ApplicationRunner {

void run(ApplicationArguments args) throws Exception;

}

特点

功能强大:通过 ApplicationArguments 提供了对命令行参数的灵活解析,包括获取选项和非选项参数。

适合场景:适用于需要对命令行参数进行复杂解析的场景。

使用示例

import org.springframework.boot.ApplicationArguments;

import org.springframework.boot.ApplicationRunner;

import org.springframework.stereotype.Component;

@Component

public class MyApplicationRunner implements ApplicationRunner {

@Override

public void run(ApplicationArguments args) throws Exception {

System.out.println("ApplicationRunner: 应用程序已启动!");

// 获取非选项参数

List nonOptionArgs = args.getNonOptionArgs();

System.out.println("非选项参数: " + nonOptionArgs);

// 获取选项参数

Set optionNames = args.getOptionNames();

System.out.println("选项参数: " + optionNames);

for (String option : optionNames) {

List values = args.getOptionValues(option);

System.out.println("选项 " + option + " 的值: " + values);

}

}

}

运行结果

如果启动应用时传入了命令行参数 --arg1 value1 --arg2 value2,输出结果为:

ApplicationRunner: 应用程序已启动!

非选项参数: []

选项参数: [arg1, arg2]

选项 arg1 的值: [value1]

选项 arg2 的值: [value2]

3. 对比

CommandLineRunner

ApplicationRunner

接口定义

void run(String... args)

void run(ApplicationArguments args)

参数处理

原始命令行参数数组 String... args

提供 ApplicationArguments 对象,支持复杂解析

使用场景

简单任务,如打印日志、加载初始数据

需要对命令行参数进行复杂解析的场景

灵活性

较低,适合简单需求

较高,适合复杂需求

4. 总结

如果你的任务只需要简单处理命令行参数,使用 **CommandLineRunner** 即可。

如果你需要对命令行参数进行复杂解析(如选项参数和非选项参数),则建议使用 **ApplicationRunner**。

在实际开发中,你可以根据需求选择适合的接口,甚至可以在同一个项目中同时使用它们。