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