0%

spring boot | 接口 CommandLineRunner

这个是在项目启动后,立马启动的一个接口。


参考资料



介绍


在项目中,经常有这样的需求,我们需要在项目启动完立即初始化一些数据(比如缓存等),以便后面调用使用。spring boot可以通过 CommandLineRunner 接口实现启动加载功能。

新建一个 Java 文件,类需要用 Component 声明下,需要实现 CommandLineRunner 接口,然后重写run方法,在 run 方法内编写需要加载的内容。
代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
package com.study.test.startup;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
* @Description: 初始化启动类
* @Author: chen
* @Date: Created in 2019/2/22
*/
@Component
public class InitStarter implements CommandLineRunner{

@Override
public void run(String... args) throws Exception {
System.out.println("CommandLineRunner example start");
}
}

启动项目,运行结果证明:CommandLineRunner 会在服务启动之后被立即执行。

在项目中,我们可以写一个类继承 CommandLineRunner 接口,然后在实现方法中写多个需要加载的方法,也可以写多个类继承 CommandLineRunner,这些类之间,可以通过order注解(@Order(value=1))实现先后顺序。

test1.class

1
2
3
4
5
6
7
8
9
@Component
@Order(value=1)
public class InitStarter implements CommandLineRunner{

@Override
public void run(String... args) throws Exception {
System.out.println("test1 start");
}
}

test2.class

1
2
3
4
5
6
7
8
9
@Component
@Order(value=2)
public class InitStarter implements CommandLineRunner{

@Override
public void run(String... args) throws Exception {
System.out.println("test2 start");
}
}

会先执行 test1 然后再执行 test2

总结:

  • CommandLineRunner 会在服务启动之后被立即执行。
  • CommandLineRunner可以有多个,且多个直接可以用order注解进行排序。

还有 @PostConstruct 也可以进行预先初始化。

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

具体可以参考

请我喝杯咖啡吧~