SpringBoot擴展點之二:ApplicationRunner和CommandLineRunner的擴展

CommandLineRunner並非Spring框架原有的概念,它屬於SpringBoot應用特定的回調擴展接口:spring

public interface CommandLineRunner {

    /**
     * Callback used to run the bean.
     * @param args incoming main method arguments
     * @throws Exception on error
     */
    void run(String... args) throws Exception;

}

關於CommandLineRunner,咱們須要關注的點有兩個:數據庫

  1. 全部CommandLineRunner的執行時間點是在SpringBoot應用的Application徹底初始化工做以後(這裏咱們能夠認爲是SpringBoot應用啓動類main方法執行完成以前的最後一步)。
  2. 當前SpringBoot應用的ApplicationContext中的全部CommandLinerRunner都會被加載執行(不管是手動註冊仍是被自動掃描註冊到IoC容器中)。

  跟其餘幾個擴展點接口類型類似,咱們建議CommandLineRunner的實現類使用@org.springframework.core.annotation.Order進行標註或者實現org.springframework.core.Ordered接口,便於對他們的執行順序進行排序調整,這是很是有必要的,由於咱們不但願不合適的CommandLineRunner實現類阻塞了後面其餘CommandLineRunner的執行。這個接口很是有用和重要,咱們須要重點關注。緩存

2、若是擴展

在使用SpringBoot構建項目時,咱們一般有一些預先數據的加載。那麼SpringBoot提供了一個簡單的方式來實現–CommandLineRunner。框架

一、在項目服務啓動的時候就去加載一些數據到緩存或作一些事情這樣的需求。ide

 

CommandLineRunner是一個接口,咱們須要時,只需實現該接口就行。若是存在多個加載的數據,咱們也可使用@Order註解來排序。
案例:spa

加載數據庫數據到緩存3d

package com.transsnet.palmpay.controller;

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
    public void run(String... strings) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 MyStartupRunner2 order 1 <<<<<<<<<<<<<");
    }
}

ApplicationRunner接口也能夠實現上述功能

實現的方式相似的,以下:code

package com.transsnet.palmpay.controller;

import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Component
@Order(value = -1)
public class MyStartupRunner3 implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println(">>>>>>>>>>>>>>>服務啓動執行,執行加載數據等操做 MyStartupRunner3 order -1 <<<<<<<<<<<<<");
    }
}

相關文章
相關標籤/搜索