1. 程式人生 > >如何在Spring Boot應用啟動之後立刻執行一段邏輯

如何在Spring Boot應用啟動之後立刻執行一段邏輯

![](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");