前言
在 Spring Boot 中,ApplicationRunner 和 CommandLineRunner 接口可以在应用启动后执行一些初始化操作或者运行一些脚本。
若想在项目启动之后立即执行某一段代码,就可以实现ApplicationRunner或 CommandLineRunner接口,相应的代码写在重写的run()方法中。
下面是这两种接口的基本介绍及其使用场景。
一、两者的区别
ApplicationRunner:
是 Spring Boot 提供的一个接口。
可以通过 Bean 的依赖注入来访问 Spring 容器中的其他 Bean。
更适合于需要访问 Spring 上下文中其他 Bean 的场景。
CommandLineRunner:
同样是 Spring Boot 提供的一个接口。
没有直接的依赖注入支持,但是可以通过构造方法注入所需的 Bean。
更适合于简单的命令行参数处理或执行一些不需要访问 Spring 上下文的简单任务。
二、CommandLineRunner接口示例
代码如下:
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Slf4j
@Component
public class CommandLineRunnerTest implements CommandLineRunner {
@Override
public void run(String... args) {
log.info("-----------CommandLineRunnerTest启动-----------");
// TODO 此处可以进行相关业务处理
}
}
当有多个CommandLineRunner继承类时,为了使他们按一定顺序执行,可以使用 @Order 注解或实现 Ordered 接口。
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Order(1)
public class CommandLineRunnerTest01 implements CommandLineRunner {
@Override
public void run(String... args) {
log.info("-----------CommandLineRunnerTest01启动-----------");
// TODO 此处可以进行相关业务处理
}
}
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@Order(2)
public class CommandLineRunnerTest02 implements CommandLineRunner {
@Override
public void run(String... args) {
log.info("-----------CommandLineRunnerTest02启动-----------");
}
}
以上代码中会先执行@Order(1)的实现类。
三、ApplicationRunner接口示例
代码如下:
@Slf4j
@Component
public class ApplicationRunnerTest implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("-----------ApplicationRunnerTest启动-----------");
// TODO 此处可以进行相关业务处理
}
}