一、CommandLineRunner

通过实现 CommandLineRunner 来定义启动任务:

1
2
3
4
5
6
7
8
@Component
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Order(1):" + Arrays.toString(args));
}
}
1
2
3
4
5
6
7
8
@Component
@Order(2)
public class MyCommandLineRunner01 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("Order(2):" + Arrays.toString(args));
}
}

其中:

  • @Order 注解为优先级,数值越小,优先级越高;
  • args 为启动类中的 String[] args;
  • args 参数可以在配置里面的 Program argumens 进行配置,也可以打成 jar 包的时候,使用命令进行设置

image-20200821142109335

最终结果如下:

image-20200821142416869

可以看到 Order(1) 的优先级高于 Order(2)

二、ApplicationRunner

通过实现 ApplicationRunner 来定义启动任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Component
@Order(3)
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Order3:");
String[] sourceArgs = args.getSourceArgs();
System.out.println("sourceArg:" + Arrays.toString(sourceArgs));
System.out.println("🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰");

List<String> nonOptionArgs = args.getNonOptionArgs();
System.out.println("nonOptionArgs:" + nonOptionArgs);
System.out.println("🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰");

Set<String> optionNames = args.getOptionNames();
for (String optionName : optionNames) {
System.out.println(optionName + args.getOptionValues(optionName));
}
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
@Component
@Order(4)
public class MyApplicationRunner01 implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("Order4");
String[] sourceArgs = args.getSourceArgs();
System.out.println("sourceArg:" + Arrays.toString(sourceArgs));
System.out.println("🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰");

List<String> nonOptionArgs = args.getNonOptionArgs();
System.out.println("nonOptionArgs:" + nonOptionArgs);
System.out.println("🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰");

Set<String> optionNames = args.getOptionNames();
for (String optionName : optionNames) {
System.out.println(optionName + args.getOptionValues(optionName));
}
System.out.println("🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰🌰");
}
}
  1. args.getNonOptionArgs():可以用来获取命令行中的无key参数;
  2. args.getOptionNames():可以用来获取所有key/value形式的参数的key;
  3. args.getOptionValues(key)):可以根据key获取key/value 形式的参数的value;
  4. args.getSourceArgs();:则表示获取命令行中的所有参数。

参数配置:

image-20200821150447765

最终结果:

image-20200821150509271

注:CommandLineRunnerApplicationRunner 是可以一起用的,优先级还是通过 @Order 进行排序

结果:

image-20200821150916948

评论