成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

CommandLineRunner與ApplicationRunner接口的使用及源碼解析

tylin / 1228人閱讀

摘要:實例定義一個實現(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的啟動流程

SpringApplication.run(args)

this.afterRefresh(context, applicationArguments)方法

跟蹤context.getBeansOfType()方法,具體實現(xiàn)在類DefaultListableBeanFactory中

總結(jié):通過以上分析可知,實現(xiàn)這兩個接口的類,在ApplicationContext.run()方法里被執(zhí)行

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/7401.html

相關(guān)文章

  • 如何在SpringBoot啟動時執(zhí)行初始化操作,兩個簡單接口就可以實現(xiàn)

    摘要:中有兩個接口能實現(xiàn)該功能和。首先了解一下的基本用法,可以在系統(tǒng)啟動后執(zhí)行里面的方法執(zhí)行數(shù)據(jù)初始化如果有多個類的話也可以通過注解指定每個類的執(zhí)行順序。 (一)概述 最...

    wuyangnju 評論0 收藏0
  • spring boot學(xué)習(xí)(4): 命令行啟動

    摘要:在使用構(gòu)建應(yīng)用啟動時,我們在工作中都是通過命令行來啟動應(yīng)用,有時候會需要一些特定的參數(shù)以在應(yīng)用啟動時,做一些初始化的操作。 在使用spring boot 構(gòu)建應(yīng)用啟動時,我們在工作中都是通過命令行來啟動應(yīng)用,有時候會需要一些特定的參數(shù)以在應(yīng)用啟動時,做一些初始化的操作。 spring boot 提供了 CommandLineRunner 和 ApplicationRunner 這兩個接...

    Binguner 評論0 收藏0
  • Spring Boot 2 - 使用CommandLineRunnerApplicationRun

    摘要:命令行參數(shù)傳遞之前我們說過使用的一大優(yōu)勢就是可以將工程直接打包成一個包而不需要單獨部署。執(zhí)行獲取到參數(shù)執(zhí)行結(jié)果我們可以發(fā)現(xiàn),通過方法的參數(shù)可以很方便地獲取到命令行參數(shù)的值。如果需要獲取命令行參數(shù)時則建議使用。 本篇文章我們將探討CommandLineRunner和ApplicationRunner的使用。 在閱讀本篇文章之前,你可以新建一個工程,寫一些關(guān)于本篇內(nèi)容代碼,這樣會加深你對本...

    alogy 評論0 收藏0
  • Spring Boot啟動退出加載項

    摘要:在一個初春的下午,甲跟我說,要在啟動服務(wù)的時候,設(shè)置表自增的起始值。寫完啟動項,那么再把退出也說一下每一個都應(yīng)該向注冊一個鉤子函數(shù)來確保能優(yōu)雅地關(guān)閉。后面退出部分翻譯地磕磕碰碰的,有不對的地方歡迎指正。原創(chuàng)不易,感謝支持。 在一個初春的下午,甲跟我說,要在Spring Boot啟動服務(wù)的時候,設(shè)置表自增的起始值。于是我用屁股想了一下,不就是在main方法里折騰嘛。后來實際操作了一把,發(fā)...

    suosuopuo 評論0 收藏0
  • 最渣 Spring Boot 文章

    摘要:如刪除臨時文件,清除緩存信息,讀取配置文件信息,數(shù)據(jù)庫連接等。提供的接口也可以滿足該業(yè)務(wù)場景。不同點中方法的參數(shù)為,而接口中方法的參數(shù)為數(shù)組。 spring-boot-starter-parent Maven的用戶可以通過繼承spring-boot-starter-parent項目來獲得一些合理的默認配置。這個parent提供了以下特性: 默認使用Java 8 使用UTF-8編碼 一...

    yanest 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<