SpringBoot实现多个ApplicationRunner时部分接口未执行

在springboot的项目中,需要在容器启动之后执行一些操作。springboot提供了ApplicationRunner和CommandLineRunner两个接口可以帮助我们实现这种需求。

当项目中实现了多个ApplicationRunner接口,并且其中一个使用了类似于while(true)这样不会退出的循环体。将会导致后续的ApplicationRunner接口不会被调用。

如下:

@Component
@Slf4j
public class RunnerTest1 implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {

        while (true) {
            System.out.println("this is RunnerTest1");
            Thread.sleep(100);
        }

    }
}
@Component
@Slf4j
public class RunnerTest2 implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {

        while (true) {
            System.out.println("this is RunnerTest2");
            Thread.sleep(100);
        }

    }
}

输出结果:

可以看到项目启动后RunnerTest2 将不会被执行。

通过分析springboot启动的源码可以发现,在applicationContext容器加载完成之后,会调用SpringApplication类的callRunners方法

该方法中会获取所有实现了ApplicationRunner和CommandLineRunner的接口bean,然后依次执行对应的run方法,并且是在同一个线程中执行。因此如果有某个实现了ApplicationRunner接口的bean的run方法一直循环不返回的话,后续的代码将不会被执行。

 

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
一个项目中可以实现多个ApplicationRunner接口。但是需要注意的是,如果其中一个ApplicationRunner接口中包含了一个不会退出的循环体(比如while(true)),那么后续的ApplicationRunner接口将不会被调用。这是因为在Spring Boot中,ApplicationRunner接口是按照优先级顺序执行的。每个ApplicationRunner接口都有一个run方法,我们只需要编写一个类,实现接口并重写run方法即可。在类上使用@Component注解将其注册为一个Spring Bean,并可以使用@Order注解指定执行顺序。例如,以下是一个示例代码: ``` @Component @Order(1) public class BootstrapManager implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { System.out.println("------ This is run method in ApplicationRunner ------"); } } ``` 在上述示例中,BootstrapManager类实现ApplicationRunner接口,并被标记为@Component和@Order(1),表示它是一个Spring Bean,并且具有较高的执行优先级。当应用程序启动Spring Boot将调用run方法,并执行其中的逻辑代码。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [SpringBoot实现多个ApplicationRunner部分接口执行](https://blog.csdn.net/u013710837/article/details/104969855)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [SpringBootApplicationRunner](https://blog.csdn.net/wangzhongshun/article/details/127416263)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值