使用场景
在应用程序开发过程中,往往我们需要在容器启动的时候执行一些操作。
Spring Boot中提供了CommandLineRunner和ApplicationRunner两个接口来实现这样的需求。
两个接口的不同
参数不同,其他大体相同,可根据实际需求选择合适的接口使用。
CommandLineRunner接口中run方法的参数为String数组,ApplicationRunner中run方法的参数为ApplicationArguments。
特殊的场景
在启动项目时,有时候我们所做的操作可能不是一次性的操作,有可能循环查询数据库,根据结果来处理不同的业务,亦或是监听消息队列……
遇到的坑
看下面一个例子,我们启动一个spring boot项目,正常启动情况下,项目启动后会打印启动时间。
如下图所示:

下面我们模拟一下启动项目时使用CommandLineRunner,有人说CommandLineRunner是项目启动完成后才调用的,我们看看现象。

再次启动spring boot 项目,看看日志,直接报错,启动异常了。

说明启动CommandLineRunner的执行其实是整个应用启动的一部分,没有打印最后的启动时间,说明项目是在CommandLineRunner执行完成之后才启动完成的。
此时CommandLineRunner的run方法执行的是一个循环,循环到第四次的时候,抛出异常,直接影响主程序的启动。
填坑
这样的问题该如何解决呢?
这个操作影响了主线程,那么我们是否可以重新开启一个线程,让他单独去做我们想要做的操作呢。

我们再看看这次的日志是什么样的:

此时CommandLineRunner执行的操作和主线程是相互独立的,抛出异常并不会影响到主线程。
程序打印了启动时间,并且CommandLineRunner中run方法报错后,应用程序并没有因为异常而终止。填坑成功。
原文链接:https://blog.csdn.net/zwq_zwq_zwq/article/details/81059017
责任编辑:lq6
-
接口
+关注
关注
33文章
9443浏览量
156135 -
spring
+关注
关注
0文章
341浏览量
15774 -
Boot
+关注
关注
0文章
154浏览量
37485
原文标题:什么?Spring Boot CommandLineRunner 有坑!?
文章出处:【微信号:AndroidPush,微信公众号:Android编程精选】欢迎添加关注!文章转载请注明出处。
发布评论请先 登录
一个硬件SPI两个CS操作两个norflash,怎么互斥操作两个norflash?
基本半导体连获两个行业奖项
看到STM8L152用两个IO用两个或非门检测两个通断,是什么原理呢?
有可能在 FX3 GPIF2 中创建两个独立的状态机吗?
请问imx8mp的LVDS0和LVDS1接口是否可以同时在两个屏幕上工作?
使用THS1206时候有两个问题求解
可以驱动两个直流有刷电机、一个双极步进电机的双H桥电机驱动芯片-SS8833E
ADS1198有两个时钟,CLK和SCLK,这两个时钟信号能接在一起吗?
在ADS828中有两个输入管脚IN+和IN-,当两个管脚的都接不同的输入的时候,输入值是如何计算的啊?
两个不同频率晶振靠的近会怎样
EE-96:将两个AD73311编解码器与ADSP-218x接口

CommandLineRunner和ApplicationRunner两个接口有何不同?
评论