前言
有时候我们需要在应用启动时执行一些代码片段,这些片段可能是仅仅是为了记录 log,也可能是在https://dayarch.top/p/pkix-certificate-import.html ,诸如上述业务要求我们可能会经常碰到
Spring Boot 提供了至少 5 种方式用于在应用启动时执行代码。我们应该如何选择?本文将会逐步解释与分析这几种不同方式
CommandLineRunner
CommandLineRunner 是一个接口,通过实现它,我们可以在 Spring 应用成功启动之后 执行一些代码片段
@Slf4j@Component@Order(2)public class MyCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("MyCommandLineRunner order is 2"); if (args.length > 0){ for (int i = 0; i < args.length; i++) { log.info("MyCommandLineRunner current parameter is: {}", args[i]); } } }}
当 Spring Boot 在应用上下文中找到 CommandLineRunner bean,它将会在应用成功启动之后调用 run() 方法,并传递用于启动应用程序的命令行参数
通过如下 maven 命令生成 jar 包:
mvn clean package
通过终端命令启动应用,并传递参数:
java -jar springboot-application-startup-0.0.1-SNAPSHOT.jar --foo=bar --name=rgyb
查看运行结果:
到这里我们可以看出几个问题:
- 命令行传入的参数并没有被解析,而只是显示出我们传入的字符串内容 --foo=bar,--name=rgyb,我们可以通过 ApplicationRunner 解析,我们稍后看
- 在重写的 run() 方法上有 throws Exception 标记,Spring Boot 会将 CommandLineRunner 作为应用启动的一部分,如果运行 run() 方法时抛出 Exception,应用将会终止启动
- 我们在类上添加了 @Order(2) 注解,当有多个 CommandLineRunner 时,将会按照 @Order 注解中的数字从小到大排序 (