SpringBoot初始化接口CommandLineRunner示例詳解
CommandLineRunner的使用
接口定義
Spring官方給出的接口定義
package org.springframework.boot;
@FunctionalInterface
public interface CommandLineRunner {
void run(String... args) throws Exception;
}在 Spring Boot 應(yīng)用程序中,CommandLineRunner 是一個(gè)接口,用于定義在應(yīng)用程序啟動(dòng)后執(zhí)行的任務(wù)。它有一個(gè)單獨(dú)的方法 run(),在應(yīng)用程序啟動(dòng)完成后自動(dòng)調(diào)用。
具體來(lái)說(shuō),CommandLineRunner 的 run() 方法會(huì)在 Spring Boot 應(yīng)用程序完成啟動(dòng)過(guò)程后立即執(zhí)行。這意味著在 Spring 上下文加載完畢、所有 Bean 實(shí)例化完成之后,run() 方法將被調(diào)用??梢钥吹?,該接口還是一個(gè)函數(shù)式接口,函數(shù)式的方式就不演示了,我們這里繼承該接口實(shí)現(xiàn)方法即可
使用
在我們需要進(jìn)行初始化的類中直接實(shí)現(xiàn)該接口的 run()方法即可注意:如果你要run方法能被執(zhí)行,你必須將實(shí)現(xiàn)了該接口的類注入到Spring容器中
CommandLineRunner 接口通常用于在應(yīng)用程序啟動(dòng)后執(zhí)行一些初始化任務(wù)或準(zhǔn)備工作,例如加載初始數(shù)據(jù)、設(shè)置定時(shí)任務(wù)、啟動(dòng)后臺(tái)線程等。通過(guò)實(shí)現(xiàn) CommandLineRunner 接口并覆蓋 run() 方法,你可以將你的任務(wù)邏輯放在其中,以便在應(yīng)用程序啟動(dòng)時(shí)自動(dòng)執(zhí)行。
@Component
public class MyComponent implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("MyComponent -> CommandLineRunner");
}
}執(zhí)行結(jié)果

可以看到該方法在Application started之后才執(zhí)行
執(zhí)行順序
需要注意的是,如果應(yīng)用程序中有多個(gè)實(shí)現(xiàn)了 CommandLineRunner 的類,它們的執(zhí)行順序可能是不確定的。如果你需要確保執(zhí)行順序,可以使用 @Order 注解或?qū)崿F(xiàn) org.springframework.core.Ordered 接口來(lái)指定順序。在 Spring Framework 中,@Order 注解用于指定組件的執(zhí)行順序。它可以應(yīng)用于類級(jí)別或方法級(jí)別。
使用 @Order 注解
示例代碼如下所示:
定義兩個(gè)類,order分別為1和2
@Component
public class MyComponent1 implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent1.class);
@Order(1)
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent1 -> CommandLineRunner");
}
}@Component
public class MyComponent2 implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent2.class);
@Order(2)
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent2 -> CommandLineRunner");
}
}運(yùn)行結(jié)果:

對(duì)于類級(jí)別的 @Order 注解,它指定了組件在 Spring 上下文中的加載順序。具體來(lái)說(shuō),數(shù)值越小的組件將先被加載和初始化。如果沒(méi)有顯式指定 @Order 注解,默認(rèn)情況下,組件的加載順序是不確定的。
實(shí)現(xiàn)Orderd接口
實(shí)現(xiàn)org.springframework.core.Ordered 中的getOrder()方法
下面再創(chuàng)建兩個(gè)類,并實(shí)現(xiàn) org.springframework.core.Ordered 接口。
@Component
public class MyComponent3 implements Ordered, CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent3.class);
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent3 -> CommandLineRunner");
}
@Override
public int getOrder() {
return 3;
}
}@Component
public class MyComponent4 implements Ordered, CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent4.class);
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent4 -> CommandLineRunner");
}
@Override
public int getOrder() {
return 4;
}
}執(zhí)行結(jié)果如下:

可以看到無(wú)論使用哪種方式都是order值更小的優(yōu)先執(zhí)行,但是實(shí)現(xiàn)org.springframework.core.Ordered接口的會(huì)比在方法上使用@Order注解的有更高的優(yōu)先級(jí),所有實(shí)現(xiàn)org.springframework.core.Ordered接口的類中的run方法會(huì)都會(huì)優(yōu)先于在方法上使用@Order注解執(zhí)行,無(wú)論設(shè)置的值是否比注解中的更小
我這里猜測(cè)可能是實(shí)現(xiàn)接口是類級(jí)別的order,所以會(huì)優(yōu)先于方法級(jí)別的order,所以我又做了下面實(shí)驗(yàn),將MyComponent1和MyComponent2中的@Order注解挪到類聲明上,所以就變成了下面這樣
@Order(1)
@Component
public class MyComponent1 implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent1.class);
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent1 -> CommandLineRunner");
}
}@Order(2)
@Component
public class MyComponent2 implements CommandLineRunner {
Logger logger = LoggerFactory.getLogger(MyComponent2.class);
@Override
public void run(String... args) throws Exception {
logger.info("MyComponent2 -> CommandLineRunner");
}
}再次執(zhí)行結(jié)果:

果然MyComponent1和MyComponent2排到前面去了,看來(lái)猜測(cè)沒(méi)有錯(cuò)
排序總結(jié)
- @Order注解在類上會(huì)比注解在方法上擁有更高的優(yōu)先級(jí)
- 實(shí)現(xiàn)org.springframework.core.Ordered接口的getOrder()方法和@Order注解在類上是相同的優(yōu)先級(jí)
- order值越小越先執(zhí)行
- order值可以為負(fù)數(shù),一樣遵循越小越優(yōu)先的規(guī)則
到此這篇關(guān)于SpringBoot初始化接口CommandLineRunner的文章就介紹到這了,更多相關(guān)SpringBoot初始化接口CommandLineRunner內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于java開(kāi)發(fā)的性能問(wèn)題總結(jié)(必看)
下面小編就為大家?guī)?lái)一篇關(guān)于java開(kāi)發(fā)的性能問(wèn)題總結(jié)(必看)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03
引入QQ郵箱發(fā)送驗(yàn)證碼進(jìn)行安全校驗(yàn)功能實(shí)現(xiàn)
最近遇到這樣的需求用戶輸入自己的郵箱,點(diǎn)擊獲取驗(yàn)證碼,后臺(tái)會(huì)發(fā)送一封郵件到對(duì)應(yīng)郵箱中,怎么實(shí)現(xiàn)呢?下面小編給大家?guī)?lái)了引入QQ郵箱發(fā)送驗(yàn)證碼進(jìn)行安全校驗(yàn)功能,需要的朋友可以參考下2023-02-02
Java concurrency之AtomicLongArray原子類_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java concurrency之AtomicLongArray原子類的相關(guān)知識(shí),感興趣的朋友參考下吧2017-06-06
Java代碼里如何拼接SQL語(yǔ)句到mybatis的xml
這篇文章主要介紹了Java代碼里拼接SQL語(yǔ)句到mybatis的xml操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
SpringSecurity在單機(jī)環(huán)境下使用方法詳解
本文詳細(xì)介紹了SpringSecurity和SpringBoot的整合過(guò)程,包括配置用戶認(rèn)證、JSP頁(yè)面的使用、數(shù)據(jù)庫(kù)認(rèn)證以及授權(quán)功能的實(shí)現(xiàn),感興趣的朋友一起看看吧2025-02-02
Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解
這篇文章主要介紹了Java算法之?dāng)?shù)組冒泡排序代碼實(shí)例講解,文中用代碼舉例講解的很清晰,有感興趣的同學(xué)可以研究下2021-03-03
SSL證書部署+SpringBoot實(shí)現(xiàn)HTTPS安全訪問(wèn)的操作方法
文章介紹了SSL和HTTPS的工作原理,包括握手階段和安全數(shù)據(jù)傳輸階段,通過(guò)模擬HTTPS請(qǐng)求,展示了如何生成自簽名證書并配置Spring Boot應(yīng)用程序以支持HTTPS,總結(jié)指出,SSL和HTTPS對(duì)于保護(hù)網(wǎng)絡(luò)安全至關(guān)重要,感興趣的朋友一起看看吧2025-02-02
Mybatisplus多表關(guān)聯(lián)分頁(yè)查詢多種實(shí)現(xiàn)方式
本文主要介紹了Mybatisplus多表關(guān)聯(lián)分頁(yè)查詢多種實(shí)現(xiàn)方式,包括使用XML自定義SQL、Wrapper搭配自定義SQL、使用DTO與自定義SQL及結(jié)合PageHelper實(shí)現(xiàn)分頁(yè)查詢,感興趣的可以了解一下2025-03-03
hashMap擴(kuò)容時(shí)應(yīng)該注意這些死循環(huán)問(wèn)題
今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著hashMap擴(kuò)容時(shí)的死循環(huán)問(wèn)題展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下2021-06-06

