在使用SpringBoot构建项目时,我们通常有一些预先数据的加载。那么SpringBoot提供了一个简单的方式来实现–CommandLineRunner。
CommandLineRunner是一个接口,我们需要时,只需实现该接口就行。如果存在多个加载的数据,我们也可以使用@Order注解来排序。
案例:
分别定义了一个数据加载类MyStartupRunner1,排序为2;以及另一个数据加载类MyStartupRunner2,排序为1
@Component
@Order(value = 2)
public class MyStartupRunner1 implements CommandLineRunner{
@Override
public void run(String... strings) throws Exception {
System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 MyStartupRunner1 order 2 <<<<<<<<<<<<<");
}
}
@Component
@Order(value = 1)
public class MyStartupRunner2 implements CommandLineRunner {
@Override
public void run(String... strings) throws Exception {
System.out.println(">>>>>>>>>>>>>>>服务启动执行,执行加载数据等操作 MyStartupRunner2 order 1 <<<<<<<<<<<<<");
}
}
@Slf4j
@Component
public class SystemCommandLineRunner implements CommandLineRunner {
@Resource
private SysConfigService sysConfigService;
@Resource
private WarnKeywordService warnKeywordService;
@Resource
private SpringTaskService springTaskService;
@Override
public void run(String... strings) throws Exception {
//初始化系统配置
initSystemConfig();
//初始化敏感词
initWarnKeyword();
//初始化定时器
initTask();
}
private void initWarnKeyword() {
warnKeywordService.initWarnKeyword();
log.info("---------------初始化敏感词成功!-------------------");
}
private void initSystemConfig() {
sysConfigService.initSysConfig();
log.info("---------------初始化系统内存成功!-------------------");
}
private void initTask() {
springTaskService.initTask();
log.info("---------------初始化定时器成功!-------------------");
}
}
这里可以控制初始化的执行顺序,在另外一个注解中
@PostConstruct
PostConstruct 和 CommandLineRunner 执行顺序,
PostConstruct 比 CommandLineRunner 要执行快。