如何在Spring Boot應用啟動之後立刻執行一段邏輯
阿新 • • 發佈:2020-06-02
![](https://img2020.cnblogs.com/other/1739473/202006/1739473-20200602100614732-265605270.png)
## 1. 前言
不知道你有沒有接到這種需求,專案啟動後立馬執行一些邏輯。比如簡單的快取預熱,或者上線後的廣播之類等等。如果你使用 **Spring Boot** 框架的話就可以藉助其提供的介面`CommandLineRunner`和 `ApplicationRunner`來實現。
## 2. CommandLineRunner
`org.springframework.boot.CommandLineRunner` 是**Spring Boot**提供的一個介面,當你實現該介面並將之注入**Spring IoC**容器後,**Spring Boot**應用啟動後就會執行其`run`方法。一個**Spring Boot**可以存在多個`CommandLineRunner`的實現,當存在多個時,你可以實現`Ordered`介面控制這些實現的執行順序(**Order 數值越大優先順序越低**)。接下來我們來宣告兩個實現並指定順序:
優先執行:
```java
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* 優先順序最高
* 該類期望在springboot 啟動後第一順位執行
* @author felord.cn
* @since 12:57
**/
@Slf4j
@Component
public class HighOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
for (String arg : args) {
log.info("arg = " + arg);
}
log.info("i am highOrderRunner");
}
@Override
public int getOrder() {
return Integer.MIN_VALUE+1;
}
}
```
第二順序執行:
```java
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
/**
* 優先順序低於{@code HighOrderCommandLineRunner}
* @author felord.cn
* @since 12:59
**/
@Slf4j
@Component
public class LowOrderCommandLineRunner implements CommandLineRunner, Ordered {
@Override
public void run(String... args) throws Exception {
log.info("i am lowOrderRunner");
}
@Override
public int getOrder() {
return Integer.MIN_VALUE+1;
}
}
```
然後啟動**Spring Boot**應用後,控制檯按照預定的順序打印出了結果:
```
2020-05-30 23:11:03.685 INFO 11976 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path ''
2020-05-30 23:11:03.701 INFO 11976 --- [ main] c.f.Application : Started SpringBootApplication in 4.272 seconds (JVM running for 6.316)
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.HighOrderCommandLineRunner : i am highOrderRunner
2020-05-30 23:11:03.706 INFO 11976 --- [ main] c.f.LowOrderCommandLineRunner : i am lowOrderRunner
```
## 3. ApplicationRunner
在**Spring Boot 1.3.0**又引入了一個和`CommandLineRunner`功能一樣的介面`ApplicationRunner`。`CommandLineRunner`接收可變引數`String... args`,而`ApplicationRunner` 接收一個封裝好的物件引數`ApplicationArguments`。除此之外它們功能完全一樣,甚至連方法名都一樣。 宣告一個`ApplicationRunner`並讓它優先順序最低:
```java
package cn.felord;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.Ordered;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* 優先順序最低
* @author felord.cn
* @since 13:00
**/
@Slf4j
@Component
public class DefaultApplicationRunner implements ApplicationRunner, Ordered {
@Override
public void run(ApplicationArguments args) throws Exception {
log.info("i am applicationRunner");