Spring Boot實踐--CommandLineRunner接口

使用場景的提出;java

       咱們在開發過程當中會有這樣的場景:須要在容器啓動的時候執行一些內容,好比:讀取配置文件信息,數據庫鏈接,刪除臨時文件,清除緩存信息,在Spring框架下是經過ApplicationListener監聽器來實現的。在Spring Boot中給咱們提供了兩個接口來幫助咱們實現這樣的需求。這兩個接口就是咱們今天要講的CommandLineRunnerApplicationRunner他們的執行時機爲容器啓動完成的時候spring

CommandLineRunner接口

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容器中時執行其run方法。多個CommandLineRunner能夠被同時執行在同一個spring上下文中而且執行順序是以order註解的參數順序一致。數組

If you need access to ApplicationArguments instead of the raw String array
consider using ApplicationRunner.
若是你須要訪問ApplicationArguments去替換掉字符串數組,能夠考慮使用ApplicationRunner類。緩存

先看一個demo:
定義一個ServerStartedReport實現CommandLineRunner,並歸入到srping容器中進行處理app

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實現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("=====應用已經成功啓動====="+ Arrays.asList(args));
    }
}

啓動類測試,也能夠直接在spring容器訪問該值,ide

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"));
    }
}

配置參數,而後執行啓動類測試

 

圖片.pngspa

打印結果

 

ApplicationRunner接口

發現兩者的官方javadoc同樣,區別在於接收的參數不同。CommandLineRunner的參數是最原始的參數,沒有作任何處理。ApplicationRunner的參數是ApplicationArguments,是對原始參數作了進一步的封裝。

ApplicationArguments是對參數(main方法)作了進一步的處理,能夠解析--name=value的,咱們就能夠經過name來獲取value(而CommandLineRunner只是獲取--name=value)

能夠接收--foo=bar這樣的參數。

--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);
    }
}

配置參數啓動,

 

打印結果:

 

相關文章
相關標籤/搜索