1.ApplicationRunner
springBoot项目启动时,若想在启动之后直接执行某一段代码,就可以用 ApplicationRunner这个接口,并实现接口里面的run(ApplicationArguments args)方法,方法中写上自己的想要的代码逻辑。
@Component //此类一定要交给spring管理 public class ConsumerRunner implements ApplicationRunner{ @Override public void run(ApplicationArgumers args) throws Exception{ //代码 System.out.println("需要在springBoot项目启动时执行的代码---"); } }
若有多个代码段需要执行,可用@Order注解设置执行的顺序。
@Component //此类一定要交给spring管理 @Order(value=1) //首先执行 public class ConsumerRunnerA implements ApplicationRunner{ @Override public void run(ApplicationArgumers args) throws Exception{ //代码 System.out.println("需要在springBoot项目启动时执行的代码1---"); } }
@Component //此类一定要交给spring管理 @Order(value=2) //其次执行 public class ConsumerRunnerB implements ApplicationRunner{ @Override public void run(ApplicationArgumers args) throws Exception{ //代码 System.out.println("需要在springBoot项目启动时执行的代码2---"); } }
注意:在使用ApplicationRunner或者CommandLineRunner时如果报错或者出现超时的情况会导致整个程序崩溃。
解决办法
在使用时另外开一个线程
@Component public class ApplicationRunnerImpl implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { new Thread(()->{ //是否创建二维码、导入Excel临时存放路径 File tempFiles = new File(CorsConfig.tempPath); if(!tempFiles.exists()){//如果文件夹不存在 tempFiles.mkdirs();//创建文件夹 System.out.println("创建临时路径:"+tempFiles); }else { System.out.println("临时路径:"+tempFiles); } //唤醒mq SpringUtil.getBean(TesSendAndGet.class); }).start(); } }
2. CommandLineRunner接口使用
CommandLineRunner、ApplicationRunner 接口是在容器启动成功后的最后一步回调(类似开机自启动)。
- 写一个类,实现CommandLineRunner接口,将该类注入到Spring容器中;
- 可以通过@Order注解(属性指定数字越小表示优先级越高)或者Ordered接口来控制执行顺序。
例如,我们自定义两个类,实现CommandLineRunner接口,实现run方法,在run方法中添加处理逻辑。
package com.ttbank.flep.core.listener; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * @Author lucky * @Date 2022/7/7 16:47 */ @Order(5) @Component public class AppStartReport implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("AppStartReport : 项目成功启动------------------"); } }
package com.ttbank.flep.core.listener; import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; /** * @Author lucky * @Date 2022/7/7 16:53 */ @Order(2) @Component public class AppStartReport2 implements CommandLineRunner { @Override public void run(String... args) throws Exception { System.out.println("AppStartReport2 : 项目成功启动------------------"); } }
代码测试:
参考文献:
https://blog.csdn.net/weixin_41667076/article/details/121701303
https://blog.csdn.net/m0_60215634/article/details/122457170