文章目录

  • ​​【Spring Boot】030-系统启动任务​​
  • ​​一、前言​​
  • ​​二、CommandLineRunner​​
  • ​​1、概述​​
  • ​​调用机制​​
  • ​​指定调用顺序​​
  • ​​2、代码演示​​
  • ​​实现类1​​
  • ​​实现类2​​
  • ​​3、运行结果​​
  • ​​4、补充说明​​
  • ​​三、ApplicationRunner​​
  • ​​1、概述​​
  • ​​2、代码演示​​
  • ​​实现类1​​
  • ​​实现类2​​
  • ​​3、运行结果​​
  • ​​4、补充说明​​

【Spring Boot】030-系统启动任务

一、前言

有一些 特殊的任务 需要在 系统启动时 执行。例如 配置文件加载、数据库初始化 等操作。如果没有使用 Spring Boot ,这些问题可以在 Listener 中解决。Spring Boot 对此提供了两种解决方案:CommandLineRunner 和 ApplicationRunner。CommandLineRunner 和 ApplicationRunner 基本一致,差别主要体现在参数上。

二、CommandLineRunner

1、概述

调用机制

Spring Boot 项目在启动时会遍历所有 CommandLineRunner 的实现类并调用其中的 run() 方法;

指定调用顺序

如果整个系统中有多个 CommandLineRunner 的实现类,那么可以使用@Order注解对这些实现类的调用顺序进行排序;

2、代码演示

实现类1

package com.zibo.api.runner;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@Slf4j
@Order(1)
public class MyCommandLineRunnerImplA implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("启动系统任务:" + "MyCommandLineRunnerImplA == @Order(1)");
}
}

实现类2

package com.zibo.api.runner;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@Slf4j
@Order(2)
public class MyCommandLineRunnerImplB implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
log.info("启动系统任务:" + "MyCommandLineRunnerImplA == @Order(2)");
}
}

3、运行结果

【Spring Boot】030-系统启动任务_系统任务

4、补充说明

  • @Order(number),其中的 number 从小到大执行,也就是值越小越先执行;
  • run 方法中的参数是启动系统时传入的参数,即入口类中的 main 方法的参数;

三、ApplicationRunner

1、概述

ApplicationRunner 的用法和 CommandLineRunner 基本一致,主要区别的 run 方法的参数;

2、代码演示

实现类1

package com.zibo.api.runner;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@Slf4j
@Order(1)
public class MyApplicationRunnerImplA implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("启动系统任务:" + "MyApplicationRunnerImplA == @Order(1)");
}
}

实现类2

package com.zibo.api.runner;

import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.annotation.Order;

@Configuration
@Slf4j
@Order(2)
public class MyApplicationRunnerImplB implements ApplicationRunner {

@Override
public void run(ApplicationArguments args) throws Exception {
log.info("启动系统任务:" + "MyApplicationRunnerImplB == @Order(2)");
}
}

3、运行结果

【Spring Boot】030-系统启动任务_ide_02

4、补充说明

  • @Order(number),其中的 number 从小到大执行,也就是值越小越先执行;
  • 这里的 run 方法的参数是一个 ApplicationArguments 对象,如果想从 ApplicationArguments 对象中获取 main 函数的参数,调用 ApplicationArguments 对象的 getNonOptionArgs 方法即可。ApplicationArguments 对象中使用 getOptionNames 方法来获取项目启动命令中的参数 key。

例如将本项目打成 jar 包,运行 java -jar xxx.jar -name=Michael 命令来启动项目,此时 getOptionNames 方法获取到的就是 name ,而 getOptionValues 方法则是获取相应的 value