Spring Boot之CommandLineRunner和ApplicationRunner

(1)使用場景的提出;java

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

 

(2)共同點和區別;數據庫

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

不一樣點:ApplicationRunner中run方法的參數ApplicationArguments,而CommandLineRunner接口中run方法的參數爲String數組緩存

在實際項目開發中,咱們會有在項目服務啓動的時候就去加載一些數據或作一些事情這樣的需求。 app

爲了解決這樣的問題,Spring Boot 爲咱們提供了一個方法,經過實現接口 CommandLineRunner 來實現。框架

很簡單,只須要一個類就能夠,無需其餘配置。 
eclipse

建立實現接口 com.kfit.runner.CommandLineRunner 的類,具體實現代碼以下:ide

import  org.springframework.boot.CommandLineRunner;
import  org.springframework.stereotype.Component;
  
/**
  * 服務啓動執行
  *
  */
@Component
public  class  MyStartupRunner1  implements  CommandLineRunner {
  
     @Override
     public  void  run(String... args)  throws  Exception {
         System.out.println( ">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做<<<<<<<<<<<<<" );
     }
  
}

Spring Boot應用程序在啓動後,會遍歷CommandLineRunner接口的實例並運行它們的run方法。也能夠利用@Order註解(或者實現Order接口)來規定全部CommandLineRunner實例的運行順序。工具

以下咱們使用@Order 註解來定義執行順序。

import  org.springframework.boot.CommandLineRunner;
import  org.springframework.core.annotation.Order;
import  org.springframework.stereotype.Component;
  
/**
  * 服務啓動執行
  *
 
  */
@Component
@Order (value= 2 )
public  class  MyStartupRunner1  implements  CommandLineRunner {
  
     @Override
     public  void  run(String... args)  throws  Exception {
         System.out.println( ">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 xxxxx <<<<<<<<<<<<<" );
     }
  
}
import  org.springframework.boot.CommandLineRunner;
import  org.springframework.core.annotation.Order;
import  org.springframework.stereotype.Component;
  
/**
  * 服務啓動執行
  *
 
  */
@Component
@Order (value= 1 )
public  class  MyStartupRunner2  implements  CommandLineRunner {
  
     @Override
     publicvoid run(String... args)  throws  Exception {
         System.out.println( ">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 ****** <<<<<<<<<<<<<" );
     }
  
}

啓動程序後,控制檯輸出結果爲:

1
2
3
>>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 ***** <<<<<<<<<<<<<
 
>>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 xxxxx <<<<<<<<<<<<<

根據控制檯結果可判斷,@Order 註解的執行優先級是按value值從小到大順序。

1
2
3
4
5
@Override
     publicvoid run(String... args)  throws  Exception {
                 System.out.println(Arrays.asList(args));
         System.out.println( ">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做11111111<<<<<<<<<<<<<" );
     }

這裏的args就是程序啓動的時候進行設置的:

 SpringApplication.run(App.class, new String[]{"hello,","林峯"});

 這裏爲了作演示,配置爲固定值了,其實直接接收main中的args便可,那麼在運行的時候,進行配置便可。

eclipse中給java應用傳args參數的方法以下:

一、先寫好Java代碼,好比文件名爲IntArrqy.java;

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

三、在彈出窗口點選第二個標籤arguments;

四、把你想輸入的參數寫在program argumenst就能夠了,多個參數使用空格隔開。

完成後點run便可經過運行結果看到參數使用狀況了。

ApplicationRunner接口也能夠實現上述功能,代碼以下:

@Component  
@Order (value =  0 )  
class  StartupRunner2  implements  CommandLineRunner{  
     @Override  
     public  void  run(String... strings)  throws  Exception {  
         System.err.println( ">>服務啓動執行,執行加載數據等操做<222222" );  
     }  
}  
   
@Component  
@Order (value = - 1 )  
class  StartupRunner3  implements  ApplicationRunner {  
   
     @Override  
     public  void  run(ApplicationArguments applicationArguments)  throws  Exception {  
         System.err.println( ">>服務啓動執行,執行加載數據等操做<333333" );  
     }  
}  
   
   
   
>>服務啓動執行,執行加載數據等操做< 333333  
>>服務啓動執行,執行加載數據等操做< 222222
相關文章
相關標籤/搜索