天天看點

Spring Boot中的系統啟動任務

文章目錄

    • 通過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中設定參數

Spring Boot中的系統啟動任務

還有一種是現将項目打包,然後在在termianl中

Spring Boot中的系統啟動任務
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 中定義方式如下:

Spring Boot中的系統啟動任務

運作啟動類,我們來看看

Spring Boot中的系統啟動任務

繼續閱讀