摘要:實例定義一個實現(xiàn),并納入到容器中進行處理啟動定義一個實現(xiàn),并納入到容器處理應(yīng)用已經(jīng)成功啟動啟動類測試,也可以直接在容器訪問該值,配置參數(shù),然后執(zhí)行啟動類打印結(jié)果接口發(fā)現(xiàn)二者的官方一樣,區(qū)別在于接收的參數(shù)不一樣。
引言我們在使用SpringBoot搭建項目的時候,如果希望在項目啟動完成之前,能夠初始化一些操作,針對這種需求,可以考慮實現(xiàn)如下兩個接口(任一個都可以)
org.springframework.boot.CommandLineRunner org.springframework.boot.ApplicationRunner
CommandLineRunner、ApplicationRunner 接口是在容器啟動成功后的最后一步回調(diào)(類似開機自啟動)。
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容器中時執(zhí)行其run方法。多個CommandLineRunner可以被同時執(zhí)行在同一個spring上下文中并且執(zhí)行順序是以order注解的參數(shù)順序一致。
If you need access to ApplicationArguments instead of the raw String array consider using ApplicationRunner.
如果你需要訪問ApplicationArguments去替換掉字符串?dāng)?shù)組,可以考慮使用ApplicationRunner類。
實例demo定義一個ServerStartedReport實現(xiàn)CommandLineRunner,并納入到srping容器中進行處理
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實現(xiàn)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("=====應(yīng)用已經(jīng)成功啟動====="+ Arrays.asList(args));
}
}
啟動類測試,也可以直接在spring容器訪問該值,
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"));
}
}
配置參數(shù),然后執(zhí)行啟動類
打印結(jié)果ApplicationRunner接口
發(fā)現(xiàn)二者的官方j(luò)avadoc一樣,區(qū)別在于接收的參數(shù)不一樣。CommandLineRunner的參數(shù)是最原始的參數(shù),沒有做任何處理。ApplicationRunner的參數(shù)是ApplicationArguments,是對原始參數(shù)做了進一步的封裝。
ApplicationArguments是對參數(shù)(main方法)做了進一步的處理,可以解析--name=value的,我們就可以通過name來獲取value(而CommandLineRunner只是獲取--name=value)
可以接收--foo=bar這樣的參數(shù)。
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); } }
配置參數(shù)啟動
打印結(jié)果總結(jié)
用戶使用CommandLineRunner或者ApplicationRunner接口均可實現(xiàn)應(yīng)用啟動初始化某些功能的需求,如果希望對參數(shù)有更多的操作,則可以選擇實現(xiàn)ApplicationRunner接口。
擴展閱讀 CommandLineRunner、ApplicationRunner執(zhí)行流程源碼分析用戶只要實現(xiàn)這兩個接口,其中的run方法就會在項目啟動時候被自動調(diào)用,那么究竟是在什么時候調(diào)用的呢?下面可以看一下Application的啟動流程
總結(jié):通過以上分析可知,實現(xiàn)這兩個接口的類,在ApplicationContext.run()方法里被執(zhí)行
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7401.html
摘要:中有兩個接口能實現(xiàn)該功能和。首先了解一下的基本用法,可以在系統(tǒng)啟動后執(zhí)行里面的方法執(zhí)行數(shù)據(jù)初始化如果有多個類的話也可以通過注解指定每個類的執(zhí)行順序。 (一)概述 最...
摘要:在使用構(gòu)建應(yīng)用啟動時,我們在工作中都是通過命令行來啟動應(yīng)用,有時候會需要一些特定的參數(shù)以在應(yīng)用啟動時,做一些初始化的操作。 在使用spring boot 構(gòu)建應(yīng)用啟動時,我們在工作中都是通過命令行來啟動應(yīng)用,有時候會需要一些特定的參數(shù)以在應(yīng)用啟動時,做一些初始化的操作。 spring boot 提供了 CommandLineRunner 和 ApplicationRunner 這兩個接...
摘要:命令行參數(shù)傳遞之前我們說過使用的一大優(yōu)勢就是可以將工程直接打包成一個包而不需要單獨部署。執(zhí)行獲取到參數(shù)執(zhí)行結(jié)果我們可以發(fā)現(xiàn),通過方法的參數(shù)可以很方便地獲取到命令行參數(shù)的值。如果需要獲取命令行參數(shù)時則建議使用。 本篇文章我們將探討CommandLineRunner和ApplicationRunner的使用。 在閱讀本篇文章之前,你可以新建一個工程,寫一些關(guān)于本篇內(nèi)容代碼,這樣會加深你對本...
摘要:在一個初春的下午,甲跟我說,要在啟動服務(wù)的時候,設(shè)置表自增的起始值。寫完啟動項,那么再把退出也說一下每一個都應(yīng)該向注冊一個鉤子函數(shù)來確保能優(yōu)雅地關(guān)閉。后面退出部分翻譯地磕磕碰碰的,有不對的地方歡迎指正。原創(chuàng)不易,感謝支持。 在一個初春的下午,甲跟我說,要在Spring Boot啟動服務(wù)的時候,設(shè)置表自增的起始值。于是我用屁股想了一下,不就是在main方法里折騰嘛。后來實際操作了一把,發(fā)...
摘要:如刪除臨時文件,清除緩存信息,讀取配置文件信息,數(shù)據(jù)庫連接等。提供的接口也可以滿足該業(yè)務(wù)場景。不同點中方法的參數(shù)為,而接口中方法的參數(shù)為數(shù)組。 spring-boot-starter-parent Maven的用戶可以通過繼承spring-boot-starter-parent項目來獲得一些合理的默認配置。這個parent提供了以下特性: 默認使用Java 8 使用UTF-8編碼 一...
閱讀 1711·2021-11-24 09:39
閱讀 2493·2021-11-18 10:07
閱讀 3675·2021-08-31 09:40
閱讀 3346·2019-08-30 15:44
閱讀 2641·2019-08-30 12:50
閱讀 3661·2019-08-26 17:04
閱讀 1438·2019-08-26 13:49
閱讀 1273·2019-08-23 18:05