使用場景的提出;java
咱們在開發過程當中會有這樣的場景:須要在容器啓動的時候執行一些內容,好比:讀取配置文件信息,數據庫鏈接,刪除臨時文件,清除緩存信息,在Spring框架下是經過ApplicationListener監聽器來實現的。在Spring Boot中給咱們提供了兩個接口來幫助咱們實現這樣的需求。這兩個接口就是咱們今天要講的CommandLineRunner和ApplicationRunner,他們的執行時機爲容器啓動完成的時候。spring
CommandLineRunner數據庫
官方doc:
Interface used to indicate that a bean should run when it is contained within a SpringApplication. Multiple CommandLineRunner beans can be defined within the same application context and can be ordered using the Ordered interface or Order @Order annotation.
接口被用做將其加入spring容器中時執行其run方法。多個CommandLineRunner能夠被同時執行在同一個spring上下文中而且執行順序是以order註解的參數順序一致。數組
If you need access to ApplicationArguments instead of the raw String array
consider using ApplicationRunner.
若是你須要訪問ApplicationArguments去替換掉字符串數組,能夠考慮使用ApplicationRunner類。緩存
先看一個demo:
定義一個ServerStartedReport實現CommandLineRunner,並歸入到srping容器中進行處理app
import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.time.LocalDateTime; @Order(2) @Component public class ServerStartedReport implements CommandLineRunner{ @Override public void run(String... args) throws Exception { System.out.println("===========ServerStartedReport啓動====="+ LocalDateTime.now()); } }
定義一個ServerSuccessReport實現CommandLineRunner,並歸入到spring容器處理框架
import org.springframework.boot.CommandLineRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import java.util.Arrays; @Order(1) @Component public class ServerSuccessReport implements CommandLineRunner{ @Override public void run(String... args) throws Exception { System.out.println("=====應用已經成功啓動====="+ Arrays.asList(args)); } }
啓動類測試,也能夠直接在spring容器訪問該值,ide
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.ConfigurableApplicationContext; @SpringBootApplication public class Application { public static void main(String[] args) { ConfigurableApplicationContext context =SpringApplication.run(Application.class,args); ApplicationArguments applicationArguments = context.getBean(ApplicationArguments.class); System.out.println("============"); System.out.println("name="+applicationArguments.getOptionNames()); System.out.println("values===="+applicationArguments.getOptionValues("developer.name")); } }
配置參數,而後執行啓動類測試
圖片.pngspa
打印結果
發現兩者的官方javadoc同樣,區別在於接收的參數不同。CommandLineRunner的參數是最原始的參數,沒有作任何處理。ApplicationRunner的參數是ApplicationArguments,是對原始參數作了進一步的封裝。
ApplicationArguments是對參數(main方法)作了進一步的處理,能夠解析--name=value的,咱們就能夠經過name來獲取value(而CommandLineRunner只是獲取--name=value)
能夠接收--foo=bar這樣的參數。
--getOptionNames()方法能夠獲得foo這樣的key的集合。
--getOptionValues(String name)方法能夠獲得bar這樣的集合的value。
看一個demo:
定義MyApplicationRunner類繼承ApplicationRunner接口,
import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.stereotype.Component; import java.util.Arrays; @Component public class MyApplicationRunner implements ApplicationRunner{ @Override public void run(ApplicationArguments args) throws Exception { System.out.println("===MyApplicationRunner==="+ Arrays.asList(args.getSourceArgs())); System.out.println("===getOptionNames========"+args.getOptionNames()); System.out.println("===getOptionValues======="+args.getOptionValues("foo")); System.out.println("==getOptionValues========"+args.getOptionValues("developer.name")); } }
啓動類,
import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class,args); } }
配置參數啓動,
打印結果: