1. 程式人生 > >102. Spring Boot之CommandLineRunner和ApplicationRunner【從零開始學Spring Boot】

102. Spring Boot之CommandLineRunner和ApplicationRunner【從零開始學Spring Boot】

 需求緣起:在有【Spring Boot啟動載入資料CommandLineRunner】文章中介紹了CommandLineRunner的使用,有人評論說實現ApplicationRunner介面也可以,那麼本節就是要介紹ComandLineRunner和ApplicationRunner區別和使用

本節大綱 (1)使用場景的提出;
(2)共同點和區別;
(3)CommandLineRunner使用例子;
(4)ApplicationRunner使用例子;
(5)使用Ordered介面或者Order註解修改執行順序;
(6)再次理解共同點和區別以及使用時機;
(7)題外話;

       具體內容接著往下看:

(1)使用場景的提出;

       我們在開發過程中會有這樣的場景:需要在容器啟動的時候執行一些內容,比如:讀取配置檔案資訊,資料庫連線,刪除臨時檔案,清除快取資訊,在Spring框架下是通過ApplicationListener監聽器來實現的。在Spring Boot中給我們提供了兩個介面來幫助我們實現這樣的需求。這兩個介面就是我們今天要講的CommandLineRunnerApplicationRunner他們的執行時機為容器啟動完成的時候

(2)共同點和區別;

共同點:其一執行時機都是在容器啟動完成的時候進行執行;其二這兩個介面中都有一個run()方法;

不同點:ApplicationRunner中run

方法的引數ApplicationArguments,而CommandLineRunner介面中run方法的引數為String陣列

(3)CommandLineRunner使用例子;

       CommandLineRunner例子大體的思路是:編寫一個class,然後實現CommandLineRunner介面,最後新增@Component註解,具體程式碼如下:

package com.kfit.config;

import org.springframework.boot.CommandLineRunner;

import org.springframework.stereotype.Component;

/**

 * 注意:需要註解:@Component

 * @author Angel --守護天使

 * @version v.0.1

 * @date 2017115

 */

@Component

public class MyStartupRunner1 implements CommandLineRunner{

    @Override

    public void run(String... argsthrows Exception {

        System.out.println("<<<<<<<<<<<<這個是測試CommandLineRunn介面>>>>>>>>>>>>>>");

    }

}

執行程式碼,觀察控制檯輸出:

<<<<<<<<<<<<這個是測試CommandLineRunn介面>>>>>>>>>>>>>>

(4)ApplicationRunner使用例子;

       ApplicationRunner例子大體的思路是:編寫一個class,然後實現ApplicationRunner介面,最後新增@Component註解,具體程式碼如下:

package com.kfit.config;

import org.springframework.boot.ApplicationArguments;

import org.springframework.boot.ApplicationRunner;

import org.springframework.stereotype.Component;

/**

 * 注意:需要新增@Component註解

 * @author Angel --守護天使

 * @version v.0.1

 * @date 2017115

 */

@Component

public class MyStartupRunner2 implements ApplicationRunner{

    @Override

    public void run(ApplicationArguments argsthrows Exception {

        System.out.println("<<<<<<<<<<<<這個是測試ApplicationRunner介面>>>>>>>>>>>>>>");

    }

}

執行,觀察控制檯輸出:

<<<<<<<<<<<<這個是測試ApplicationRunner介面>>>>>>>>>>>>>>

(5)使用Ordered介面或者Order註解修改執行順序;

問題提出: 如果有多個實現類,而我們需要按照一定的順序執行的話,那麼應該怎麼辦呢?

解決方案:其一可以在實現類上加上@Order註解指定執行的順序;其二可以在實現類上實現Ordered介面來標識。

需要注意:數字越小,優先順序越高,也就是@Order(1)註解的類會在@Order(2)註解的類之前執行。

(6)再次理解共同點和區別以及使用時機;

在之前談過的區別就不說了,我們看看官方文件對CommandLineRunner和ApplicationRunner的區別說明:

Java程式碼  收藏程式碼
  1. Interface used to indicate that a bean should run when it is contained within   
  2. a SpringApplication. Multiple CommandLineRunner beans can be defined   
  3. within the same application context and can be ordered using the Ordered   
  4. interface or @Order annotation.   
  5. If you need access to ApplicationArguments instead of the raw String array consider using ApplicationRunner.  

其實沒有很大區別,如果想要更詳細地獲取命令列引數,那就使用ApplicationRunner介面。

(7)題外話;

-----------------------------------------------------------------

Eclipse中給java應用傳args引數的方法如下:

1、先寫好Java程式碼,比如檔名為IntArrqy.java;

2、在工具欄或選單上點run as下邊有個Run Configuration;

3、在彈出視窗點選第二個標籤arguments;

4、把你想輸入的引數寫在program argumenst就可以了,多個引數使用空格隔開。

完成後點run即可通過執行結果看到引數使用情況了。

-------------------------------------------------------------