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中給我們提供了兩個介面來幫助我們實現這樣的需求。這兩個介面就是我們今天要講的CommandLineRunner和ApplicationRunner,他們的執行時機為容器啟動完成的時候。
(2)共同點和區別;
共同點:其一執行時機都是在容器啟動完成的時候進行執行;其二這兩個介面中都有一個run()方法;
不同點:ApplicationRunner中run
(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 2017年1月15日
*/
@Component
public class MyStartupRunner1 implements CommandLineRunner{
@Override
public void run(String... args) throws 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 2017年1月15日
*/
@Component
public class MyStartupRunner2 implements ApplicationRunner{
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("<<<<<<<<<<<<這個是測試ApplicationRunner介面>>>>>>>>>>>>>>");
}
}
執行,觀察控制檯輸出:
<<<<<<<<<<<<這個是測試ApplicationRunner介面>>>>>>>>>>>>>>
(5)使用Ordered介面或者Order註解修改執行順序;
問題提出: 如果有多個實現類,而我們需要按照一定的順序執行的話,那麼應該怎麼辦呢?
解決方案:其一可以在實現類上加上@Order註解指定執行的順序;其二可以在實現類上實現Ordered介面來標識。
需要注意:數字越小,優先順序越高,也就是@Order(1)註解的類會在@Order(2)註解的類之前執行。
(6)再次理解共同點和區別以及使用時機;
在之前談過的區別就不說了,我們看看官方文件對CommandLineRunner和ApplicationRunner的區別說明:
Java程式碼- 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 annotation.
- 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即可通過執行結果看到引數使用情況了。
-------------------------------------------------------------