4.9. 启动系统任务
有一些特殊的任务需要在系统启动前执行,例如配置文件加载、数据库初始化等操作。如果没有使用Spring Boot,这些问题可以在Listener 中解决。Spring Boot 对此提供了两种解决方案:CommandLineRunner 和ApplicationRunner 。CommandLineRunner 和ApplicationRunner 基本一致,差别主要体现在参数上。
4.9.1. CommandLineRunner
Spring Boot 项目在启动时会遍历所有CommandLineRunner 的实现类并调用其中的run 方法,如果整个系统中有多个CommandLineRunner 的实现类,那么可以使用@Order 注解对这些实现类的调用顺序进行排序。
@Component @Order(1) public class MyCommandLineRunner1 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("Runnerl>>>" + Arrays.toString(args)); } @Component @Order(2) public class MyCommandLineRunner2 implements CommandLineRunner { @Override public void run (String... args) throws Exception { System.out.println("Runner2>>>" + Arrays.toString(args)); } }
@Order(1)注解用来描述CommandLineRunner 的执行顺序,数字越小越先执行。
参数是系统启动时传入的参数,即入口类中main 方法的参数(在调用SpringApplication.run 方法时被传入Spring Boot 项目中)。
4.9.2. ApplicationRunner
@Component @Order(2) public class MyApplicationRunner1 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { List<String> nonOptionArgs = args.getNonOptionArgs(); System.out.println("1-nonOptionArgs>>>" + nonOptionArgs); Set<String> optionNames = args.getOptionNames(); for(String optionName : optionNames) { System.out.println("1-key:" + optionName + ";value:" + args.getOptionValues(optionName));
} }
@Component @Order(1) public class MyApplicationRunner2 implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { List<String> nonOptionArgs = args.getNonOptionArgs(); System.out.println("2-nonOptionArgs>>>" + nonOptionArgs); Set<String> optionNames = args.getOptionNames(); for(String optionName : optionNames ) { System.out.println("2-key:" + optionName + ";value:" + args.getOptionValues(optionName));
}
}
这里run 方法的参数是一个ApplicationArguments 对象, 如果想从ApplicationArguments 对象中获取入口类中main 方法接收的参数,调用ApplicationArguments 中的getNonOptionArgs 方法即可。
ApplicationArguments中的getOptionNames 方法用来获取项目启动命令行中参数的key 例如将本项目打成jar 包,运行java -jar xxx.jar -name=Michael 命令来启动项目, 此时getOptionNames 方法获取到的是name , 而getOptionValues 方法则是获取相应的value .
接下来运行mvnpackage 命令对项目进行打包
mvn package
进入打包目录中, 执行如下命令启动项目:
Java - jar linerunner-0.0.1.jar --name=Michael --age=99 三国演义 罗贯中
--name=Michael --age=99 都属于getOptionNames/getOptionValues 范畴。
后面的“三国演义”“罗贯中”可以通过getNonOptionArgs 方法获取,获取到的是一个数组,相当于上文提到的运行时配直的ProgramArguments 。
结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)