CommandLineRunner,ApplicationRunner

业务场景:
应用服务启动时,加载一些数据和执行一些应用的初始化动作。如:删除临时文件,清除缓存信息,读取配置文件信息,数据库连接等。
SpringBoot提供了CommandLineRunner和ApplicationRunner接口。当接口有多个实现类时,提供了@order注解实现自定义执行顺序,也可以实现Ordered接口来自定义顺序。
注意:数字越小,优先级越高,也就是@Order(1)注解的类会在@Order(2)注解的类之前执行。
两者的区别在于:
ApplicationRunner中run方法的参数为ApplicationArguments,而CommandLineRunner接口中run方法的参数为String数组。想要更详细地获取命令行参数,那就使用ApplicationRunner接口

ApplicationRunner

@Component
@Order(value = 1)
public class AgentApplicationRun2 implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments applicationArguments) throws Exception {

    }
}

CommandLineRunner

@Component
@Order(value = 12)
public class AgentApplicationRun implements CommandLineRunner {

    @Override
    public void run(String... strings) throws Exception {

    }
}

如果用实现CommandLineRunner 但其初始化动作,不是必须完成才能运行。最好开启多线程,因为CommandLineRunner 默认是由主线程启动,若出错,其后的主线程会直接退出。
但CommandLineRunner 这个初始化动作一般是必须的。所以,大部分不需要新启线程。

新启线程方法

package com.d4c.custombean.config;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
@Slf4j
public class MyRunner implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        log.info("--------MyRunner----------");
        int i = 0;
        new Thread() {
            @Override
            public void run() {
                //TODO
            }
        }.start();
        
    }
}


CommandLineRunner与@PostConstruct区别

在一个类内,如果有构造器(Constructor ),有@PostConstruct,还有@Autowired,他们的先后执行顺序为Constructor >> @Autowired >> @PostConstruct。

因为一个有声明注解的类文件(必须有声明,这样在项目初始化时候才会注入),在项目启动后,会对对象进行依赖注入,而初始化的动作会依赖于对象,所以假象上看,也类似于项目启动就会执行的操作,因此,我们也可以通过这样的形式,对数据进行初始化。

说明一下,@PostConstruct更针对性于当前类文件,而CommandLineRunner更服务于整个项目。所以在我们使用中,可根据自己的使用场景来进行选择用这两种方式来实现初始化。

引用参考

spring boot:ApplicationRunner和CommandLineRunner用法区别
spring boot 启动加载 CommandLineRunner @PostConstruct
使用Spring Boot 的CommandLineRunner遇到的坑

你可能感兴趣的:(CommandLineRunner,ApplicationRunner)