• 有一些特殊的任务需要在系统启动时执行,例如配置文件的加载、数据库初始化等操作。

如果不使用Spring Boot,可以使用Listener解决。

  • Spring Boot 对此提供了两种解决方案,CommandLineRunner和ApplicationRunner。

CommandLineRunner和ApplicationRunner基本一致,差别主要体现在参数上

1 、CommandLineRunner

Spring Boot 项目在启动时会遍历所有CommandLineRunner的实现类并调用其中的run方法,如果整个系统中有多个CommandLineRunner的实现类,那么可以使用@Order注解对这些实现类的调用顺序进行排序。

  1. @Component
  2. @Order(1)
  3. @Slf4j
  4. public class MyCommandLineRunner1 implements CommandLineRunner {
  5. @Override
  6. public void run(String... args) throws Exception {
  7. log.info("Runner1>>>"+ Arrays.toString(args));
  8. }
  9. }
  10. @Component
  11. @Order(2)
  12. @Slf4j
  13. public class MyCommandLineRunner2 implements CommandLineRunner {
  14. @Override
  15. public void run(String... args) throws Exception {
  16. log.info("Runner2>>>"+ Arrays.toString(args));
  17. }
  18. }

代码说明:
@Order(2)注解来描述CommandLineRunner的执行顺序,数字越小越先执行。
Run 方法中是调用的核心逻辑,参数是系统启动时传入的参数,即入口类中main方法的参数。

2 、ApplicationRunner

ApplicationRunner的用法和CommandLineRunner基本一致,区别只要体现在run方法的参数上。

  1. @Component
  2. @Order(1)
  3. @Slf4j
  4. public class MyApplicationRunner1 implements ApplicationRunner {
  5. @Override
  6. public void run(ApplicationArguments args) throws Exception {
  7. List<String> nonOptionArgs=args.getNonOptionArgs();
  8. System.out.println("runner1-主方法的参数args:"+nonOptionArgs);
  9. //getOptionNames()获取主函数参数中的键值对的所有键集合
  10. Set<String> optionNames=args.getOptionNames();
  11. for(String optionName:optionNames){
  12. //getOptionValues(optionName)通过键获取值
  13. System.out.println("runner1,key:"+optionName+";value="+args.getOptionValues(optionName));
  14. }
  15. }
  16. }
  1. @Component
  2. @Order(2)
  3. @Slf4j
  4. public class MyApplicationRunner2 implements ApplicationRunner {
  5. @Override
  6. public void run(ApplicationArguments args) throws Exception {
  7. List<String> nonOptionArgs=args.getNonOptionArgs();
  8. System.out.println("runner2-主方法的参数args:"+nonOptionArgs);
  9. Set<String> optionNames=args.getOptionNames();
  10. for(String optionName:optionNames){
  11. System.out.println("runner2,key:"+optionNames+";value="+args.getOptionValues(optionName));
  12. }
  13. }
  14. }

代码说明:
@Order注解依然是用来描述执行顺序的,数字越小越优先执行。
Run方法的参数是ApplicationArguments对象,如果想从ApplicationArguments对象中获取入口类中main方法接收的参数,调用ApplicationArguments的getNonOptionArgs即可,
ApplicationArguments中的getOptionNames方法用来获取项目启动命令行中参数的key

使用下面命令测试:

  1. java -jar ***.jar --name=guanyu --age=20 西游记 吴承恩