文章目錄
-
- 通過CommandLineRunner 實作系統啟動任務
- 通過ApplicationRunner 實作系統啟動任務
在 Servlet/Jsp 項目中,如果涉及到系統任務,例如在項目啟動階段要做一些資料初始化操作,這些操作有一個共同的特點,隻在項目啟動時進行,以後都不再執行,這裡,容易想到web基礎中的三大元件( Servlet、Filter、Listener )之一 Listener ,這種情況下,一般定義一個 ServletContextListener,然後就可以監聽到項目啟動和銷毀,進而做出相應的資料初始化和銷毀操作,例如:
public class MyListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
//資料初始化操作
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
//資料銷毀操作
}
}
這是基礎 web 項目的解決方案,使用了 Spring Boot,那麼我們可以使用更為簡便的方式。Spring Boot 中針對系統啟動任務提供了兩種解決方案,分别是 CommandLineRunner 和 ApplicationRunner,下面我們就倆看看具體的實作
通過CommandLineRunner 實作系統啟動任務
我們需要自定義MyCommandLineRunner ,實作CommandLineRunner ,實作預設的run方法
package com.zhouym.systemstartuptask;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/9
* @since 1.0.0
*/
@Component
@Order(100)
public class MyCommandLineRunner implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("MyCommandLineRunner:" + Arrays.toString(args));
}
}
1、通過@Component注解将MyCommandLineRunner 注冊為spring容器中的一個bean
2、通過@Order注解實作啟動任務的優先級,預設是Integer.MAX_VALUE,這裡面的數字越大,優先級就越低
3、在重寫的run方法中處理邏輯代碼,在系統啟動就會執行我們的run方法
4、run方法中的參數來自我們項目的啟動參數,即項目的入口處
參數傳遞有兩種方式,一種是就是下圖中,可以在Program Arguments中設定參數
還有一種是現将項目打包,然後在在termianl中
cd target
然後再執行
java -jar devtools-0.0.1-SNAPSHOT.jar 參數名(可以傳遞多個)
通過ApplicationRunner 實作系統啟動任務
ApplicationRunner 和 CommandLineRunner 功能一緻,用法也基本一緻,唯一的差別主要展現在對參數的處理上,ApplicationRunner 可以接收更多類型的參數(ApplicationRunner 除了可以接收 CommandLineRunner 的參數之外,還可以接收 key/value形式的參數)。
使用 ApplicationRunner ,自定義類實作 ApplicationRunner 接口即可,元件注冊以及元件優先級的配置都和 CommandLineRunner 一緻,如下:
package com.zhouym.systemstartuptask;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
import java.util.Arrays;
import java.util.List;
import java.util.Set;
/**
* 〈〉
*
* @author zhouym
* @create 2019/8/9
* @since 1.0.0
*/
@Component
@Order(100)
public class MyApplicationRunner implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
//擷取指令行中無key參數
List<String> nonOptionArgs = args.getNonOptionArgs();
//擷取所有key/value形式的參數的key
Set<String> optionNames = args.getOptionNames();
for (String key:
optionNames) {
//根據key擷取key/value形式的參數的value值
System.out.println("MyApplicationRunner---"+key+":"+args.getOptionValues(key));
}
//擷取指令行中的所有參數
String[] sourceArgs = args.getSourceArgs();
System.out.println("MyApplicationRunner:"+ Arrays.toString(sourceArgs));
}
}
ApplicationRunner 定義完成後,傳啟動參數也是兩種方式,參數類型也有兩種,第一種和 CommandLineRunner 一緻,第二種則是 –key=value 的形式,在 IDEA 中定義方式如下:
運作啟動類,我們來看看