场景
- 项目经常需要在启动之后完成一些初始化的工作,在整个项目周期只执行一次
解决
-
通过监听ApplicationReadyEvent事件实现 -
实现CommandLineRunner接口, 在项目启动之后执行run方法,并传递用于启动应用程序的命令行参数 具体操作如下
@Component 注册为bean @Order控制启动顺序,但是不建议使用,顺序意味着有前后依赖,不安全 run方法有抛出异常,Spring Boot 会将 CommandLineRunner 作为应用启动的一部分,如果运行 run() 方法时抛出 Exception,应用将会终止启动 (这会导致DisposableBean触发)
@Component
@Order(3)
@Slf4j
public class MyCommandLineRunner2 implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("MyCommandLineRunner2 is running and order is 3");
}
}
@Component
@Slf4j
@Order(2)
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("MyCommandLineRunner is running and order is 2");
}
}
- ApplicationRunner 和CommandLineRunner基本相同,只是对命令行参数的处理不同,ApplicationRunner会对参数解析
@Component
@Order(4)
@Slf4j
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("MyApplicationRunner is running and order is 4");
}
}
|