CommandLineRunner和ApplicationRunner的作用和使用示例

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

1. CommandLineRunner

定义

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

接口定义

public interface CommandLineRunner {
    void run(String... args) throws Exception;
}

特点

  1. 简单易用:直接接收原始的命令行参数数组。
  2. 适合场景:适用于简单的初始化任务,如打印日志、加载初始数据等。

使用示例

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;
}

特点

  1. 功能强大:通过 ApplicationArguments 提供了对命令行参数的灵活解析,包括获取选项和非选项参数。
  2. 适合场景:适用于需要对命令行参数进行复杂解析的场景。

使用示例

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<String> nonOptionArgs = args.getNonOptionArgs();
        System.out.println("非选项参数: " + nonOptionArgs);

        // 获取选项参数
        Set<String> optionNames = args.getOptionNames();
        System.out.println("选项参数: " + optionNames);

        for (String option : optionNames) {
            List<String> values = args.getOptionValues(option);
            System.out.println("选项 " + option + " 的值: " + values);
        }

    }

}

运行结果

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

ApplicationRunner: 应用程序已启动!
非选项参数: []
选项参数: [arg1, arg2]
选项 arg1 的值: [value1]
选项 arg2 的值: [value2]

3. 对比

CommandLineRunnerApplicationRunner
接口定义void run(String... args)void run(ApplicationArguments args)
参数处理原始命令行参数数组 String... args提供 ApplicationArguments
对象,支持复杂解析
使用场景简单任务,如打印日志、加载初始数据需要对命令行参数进行复杂解析的场景
灵活性较低,适合简单需求较高,适合复杂需求

4. 总结

  1. 如果你的任务只需要简单处理命令行参数,使用 **CommandLineRunner** 即可。
  2. 如果你需要对命令行参数进行复杂解析(如选项参数和非选项参数),则建议使用 **ApplicationRunner**

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

付聪1210

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值