springboot項目啟動成功后執行task的方式


springboot項目啟動成功后執行task的方式

 

1、實現ApplicationRunner接口

  package com.lnjecit.lifecycle;

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

/**
 * @author lnj
 * createTime 2018-11-07 22:37
 **/
@Component
public class ApplicationRunnerImpl implements ApplicationRunner {
    @Override
    public void run(ApplicationArguments args) throws Exception {
        System.out.println("通過實現ApplicationRunner接口,在spring boot項目啟動后打印參數");
        String[] sourceArgs = args.getSourceArgs();
        for (String arg : sourceArgs) {
            System.out.print(arg + " ");
        }
        System.out.println();
    }
}

 

項目啟動后,會打印如下信息:

 

 

2、實現CommandLineRunner接口

package com.lnjecit.lifecycle;

import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

/**
 * @author lnj
 * createTime 2018-11-07 22:25
 **/
@Component
public class CommandLineRunnerImpl implements CommandLineRunner {
    @Override
    public void run(String... args) throws Exception {
        System.out.println("通過實現CommandLineRunner接口,在spring boot項目啟動后打印參數");
        for (String arg : args) {
            System.out.print(arg + " ");
        }
        System.out.println();
    }
}

 

 

 兩種實現方式的不同之處在於run方法中接收的參數類型不一樣

 

指定執行順序

當項目中同時實現了ApplicationRunner和CommondLineRunner接口時,可使用Order注解或實現Ordered接口來指定執行順序,值越小越先執行

 

原理

通過調試可以發現都是在 org.springframework.boot.SpringApplication#run(java.lang.String...)方法內的afterRefresh(上下文刷新后處理)方法時,會執行callRunners方法。

afterRefresh方法具體實現如下: 

protected void afterRefresh(ConfigurableApplicationContext context,
        ApplicationArguments args) {
    callRunners(context, args);
}

callRunners方法具體實現如下: 

private void callRunners(ApplicationContext context, ApplicationArguments args) {
    List<Object> runners = new ArrayList<Object>();
    runners.addAll(context.getBeansOfType(ApplicationRunner.class).values());
    runners.addAll(context.getBeansOfType(CommandLineRunner.class).values());
    AnnotationAwareOrderComparator.sort(runners);
    for (Object runner : new LinkedHashSet<Object>(runners)) {
        if (runner instanceof ApplicationRunner) {
            callRunner((ApplicationRunner) runner, args);
        }
        if (runner instanceof CommandLineRunner) {
            callRunner((CommandLineRunner) runner, args);
        }
    }
}

 可以看出上下文完成刷新后,依次調用注冊的runners, runners的類型為 ApplicationRunner 或 CommandLineRunner

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM