欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Springboot ApplicationRunner的使用解讀

 更新時(shí)間:2023年05月16日 09:38:30   作者:澄風(fēng)  
這篇文章主要介紹了Springboot ApplicationRunner的使用解讀,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

Springboot ApplicationRunner使用

ApplicationRunner介紹

ApplicationRunner是在應(yīng)用容器啟動(dòng)之后會(huì)回調(diào)到,在ApplicationStartedListener調(diào)用之后被調(diào)用。

如果說ApplicationListener中有阻塞,那么ApplicationRunner也都不會(huì)被調(diào)用。

@Component
public class ApplicationRunnerTest implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(args);
    }
}

我們可以在applicationRunner中做一些異步啟動(dòng)的操作,比如實(shí)例化Kafka客戶端,異步加載緩存等等在服務(wù)啟動(dòng)之后不立馬提供服務(wù)的操作。

通過分析源碼可以知道runner實(shí)在容器加載完成以及ApplicationStartedListener調(diào)用之后進(jìn)行回調(diào)的。

ApplicationRunner為什么不被調(diào)用

問題描述

在項(xiàng)目中寫了一個(gè)ApplicationRunner 來啟動(dòng)消費(fèi)隊(duì)列線程,結(jié)果啟動(dòng)的時(shí)候applicationRunner的run方法死活不被調(diào)用。

問題分析

通過debug發(fā)現(xiàn),在springboot初始化完環(huán)境refresh context之后就會(huì)調(diào)用started listener然后調(diào)用application runner,如果started listner 存在阻塞的話就會(huì)導(dǎo)致后續(xù)的application runner 不被運(yùn)行。

而我在另一個(gè)組件中使用ApplicationListener<ApplicationStartedEvent> 去啟動(dòng)了netty server,啟動(dòng)netty server會(huì)導(dǎo)致當(dāng)前線程阻塞以至于application runner 不被調(diào)用。

問題解決

在listener和Runner當(dāng)中盡量啟用線程來跑阻塞而不是直接去跑阻塞任務(wù)。

ApplicationRunner的作用是什么?

有時(shí)針對(duì)一些特殊的業(yè)務(wù)場景,需要在系統(tǒng)啟動(dòng)時(shí)執(zhí)行某些任務(wù),如:配置文件的加載、數(shù)據(jù)庫的初始化等等操作。

SpringBoot 提供了兩種解決方案:

  • 一種是使用CommandLineRunner
  • 另一種是使用 ApplicationRunner

基本原理

項(xiàng)目在啟動(dòng)時(shí)會(huì)遍歷所有的 ApplicationRunner 的實(shí)現(xiàn)類并調(diào)用其中的 run 方法,如果在系統(tǒng)中有多個(gè) ApplicationRunner的實(shí)現(xiàn)類,可以使用 @Order 注解對(duì)這些實(shí)現(xiàn)類的調(diào)用順序進(jìn)行排序(數(shù)字越小越先執(zhí)行);run方法的參數(shù)是系統(tǒng)啟動(dòng)時(shí)傳入的參數(shù),即入口類中main方法的參數(shù)(在調(diào)用SpringApplication.run方法時(shí)傳入到 SpringBoot項(xiàng)目的上下文環(huán)境中)。

如何使用

@Component
@Slf4j
@Order(1)
public class MyApplicationRunner implements ApplicationRunner {
?? ?// ApplicationArguments, 需要區(qū)分選項(xiàng)參數(shù)和非選項(xiàng)參數(shù);
?? ?// 選項(xiàng)參數(shù), 通過ApplicationArguments的getOptionNames()方法獲取所有選項(xiàng)名稱即參數(shù)的KEY, 然后通過 getOptionValues()方法根據(jù)參數(shù)KEY, 獲取實(shí)際值(它會(huì)返回一個(gè)列表字符串), 一般為: --user-name=ROCKY --age=30
?? ?// 非選項(xiàng)參數(shù), 通過ApplicationArguments的getNonOptionArgs()方法獲取一個(gè)參數(shù)值數(shù)組;
? ? @Override
? ? public void run(ApplicationArguments args) throws Exception {
? ? ?? ?// TO DO SOMETHING...
? ? }
}

ApplicationRunner和CommandLineRunner的區(qū)別

@Component
@Slf4j
@Order(1)
public class MyCommandLineRunner implements CommandLineRunner {
? ? @Override
? ? public void run(String... args) throws Exception {
? ? ?? ?// TO DO SOMETHING...
? ? }
}?

ApplicationRunner與CommandLineRunner的主要區(qū)別體現(xiàn)在run方法的參數(shù)上,CommandLineRunner中的run方法的參數(shù)是參數(shù)數(shù)組;ApplicationRunner中的run方法的參數(shù)是ApplicationArguments對(duì)象。

執(zhí)行順序

系統(tǒng)支持創(chuàng)建多個(gè)CommandLineRunner或ApplicationRunner的實(shí)現(xiàn)類,可以使用@Order注解或?qū)崿F(xiàn)Ordered接口,來設(shè)定各個(gè)實(shí)現(xiàn)類的執(zhí)行順序。

選項(xiàng)參數(shù)與非選項(xiàng)參數(shù)

  • 選項(xiàng)參數(shù):可以理解為Spring Boot 提供的參數(shù)格式,以–開頭,使用=分割鍵值對(duì),如:java -jar XXX.jar --name=ROCKY --age=30 --spring.profiles.active=dev;
  • 非選項(xiàng)參數(shù):不是以–開頭,也沒有設(shè)置值的單一參數(shù)KEY只有值,如:java -jar XXX.jar --name=ROCKY --age=30 --spring.profiles.active=dev 陜西 西安 雁塔區(qū),其中"陜西 西安 雁塔區(qū)" 就是非選項(xiàng)參數(shù);
  • 系統(tǒng)參數(shù):-Dxxxx是設(shè)置JAVA運(yùn)行上下文的參數(shù)語法,用于配置一些環(huán)境變量,如:java -jar XXX.jar -Dserver.port=8081 --name=ROCKY --age=30 --spring.profiles.active=dev 陜西 西安 雁塔區(qū),其中"-Dserver.port"就是系統(tǒng)參數(shù)。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • spring mvc4中相關(guān)注解的詳細(xì)講解教程

    spring mvc4中相關(guān)注解的詳細(xì)講解教程

    這篇文章主要給大家介紹了關(guān)于spring mvc4中相關(guān)注解的相關(guān)資料,其中詳細(xì)介紹了關(guān)于@Controller、@RequestMapping、@RathVariable、@RequestParam及@RequestBody等等注解的相關(guān)內(nèi)容,需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-06-06
  • 關(guān)于Spring配置文件加載方式變化引發(fā)的異常詳解

    關(guān)于Spring配置文件加載方式變化引發(fā)的異常詳解

    這篇文章主要給大家介紹了關(guān)于Spring配置文件加載方式變化引發(fā)的異常的相關(guān)資料,文中通過實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Spring具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2022-01-01
  • SpringAop切入點(diǎn)execution表達(dá)式的深入講解

    SpringAop切入點(diǎn)execution表達(dá)式的深入講解

    Spring AOP 可能會(huì)經(jīng)常使用 execution切入點(diǎn)指示符,下面這篇文章主要給大家介紹了關(guān)于SpringAop切入點(diǎn)execution表達(dá)式的相關(guān)資料,需要的朋友可以參考下
    2021-08-08
  • SpringBoot如何使用applicationContext.xml配置文件

    SpringBoot如何使用applicationContext.xml配置文件

    這篇文章主要介紹了SpringBoot使用applicationContext.xml配置文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • SpringBoot實(shí)現(xiàn)異步事件Event詳解

    SpringBoot實(shí)現(xiàn)異步事件Event詳解

    這篇文章主要介紹了SpringBoot實(shí)現(xiàn)異步事件Event詳解,異步事件的模式,通常將一些非主要的業(yè)務(wù)放在監(jiān)聽器中執(zhí)行,因?yàn)楸O(jiān)聽器中存在失敗的風(fēng)險(xiǎn),所以使用的時(shí)候需要注意,需要的朋友可以參考下
    2023-11-11
  • Java 網(wǎng)絡(luò)編程socket編程等詳解

    Java 網(wǎng)絡(luò)編程socket編程等詳解

    本篇文章主要介紹了java網(wǎng)絡(luò)編程中的類的方法以及實(shí)例,需要的朋友可以參考下
    2017-04-04
  • Spring系列中的beanFactory與ApplicationContext

    Spring系列中的beanFactory與ApplicationContext

    這篇文章主要介紹了Spring系列中的beanFactory與ApplicationContext,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的小伙伴可以參考一下
    2022-09-09
  • 基于@RequestBody和@ResponseBody及Stringify()的作用說明

    基于@RequestBody和@ResponseBody及Stringify()的作用說明

    這篇文章主要介紹了基于@RequestBody和@ResponseBody及Stringify()的作用說明,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • springboot支持https請(qǐng)求的實(shí)現(xiàn)

    springboot支持https請(qǐng)求的實(shí)現(xiàn)

    本文主要介紹了springboot支持https請(qǐng)求的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-01-01
  • Java并發(fā)編程之淺談ReentrantLock

    Java并發(fā)編程之淺談ReentrantLock

    今天帶大家學(xué)習(xí)Java并發(fā)編程的相關(guān)知識(shí),文中對(duì)Java ReentrantLock作了非常詳細(xì)的圖文示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論