国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

tylin / 1219人閱讀

摘要:實(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)流程

SpringApplication.run(args)

this.afterRefresh(context, applicationArguments)方法

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

總結(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

相關(guān)文章

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

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

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

    摘要:在使用構(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è)接...

    Binguner 評(píng)論0 收藏0
  • Spring Boot 2 - 使用CommandLineRunnerApplicationRun

    摘要:命令行參數(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ì)本...

    alogy 評(píng)論0 收藏0
  • Spring Boot啟動(dòng)退出加載項(xiàng)

    摘要:在一個(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ā)...

    suosuopuo 評(píng)論0 收藏0
  • 最渣 Spring Boot 文章

    摘要:如刪除臨時(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編碼 一...

    yanest 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<