【SpringBoot】中的ApplicationRunner接口 和 CommandLineRunner接口

1. ApplicationRunner接口

用法:

  • 類型: 接口

  • 方法: 只定義了一個run方法

  • 使用場景: springBoot項目啟動時,若想在啟動之后直接執行某一段代碼,就可以用 ApplicationRunner這個接口,并實現接口里面的run(ApplicationArguments args)方法,方法中寫上自己的代碼邏輯。也就是:spring容器啟動完成之后,就會緊接著執行這個接口實現類的run方法。

  • run方法的參數: ApplicationArguments可以獲取到當前項目執行的命令參數。(比如把這個項目打成jar執行的時候,帶的參數可以通過ApplicationArguments獲取到);

@Component  //此類一定要交給spring管理
public class ConsumerRunner implements ApplicationRunner{@Overridepublic void run(ApplicationArgumers args) throws Exception{//代碼System.out.println("需要在springBoot項目啟動時執行的代碼---");}
}

若有多個代碼段需要執行,可用@Order注解設置執行的順序。

在同一個項目中,可以定義多個ApplicationRunner的實現類,他們的執行順序通過注解@Order注解或者再實現Ordered接口來實現。
@Order注解: 如果有多個實現類,而你需要他們按一定順序執行的話,可以在實現類上加上@Order注解。@Order(value=整數值)。SpringBoot會按照@Order中的value值從小到大依次執行。

@order, 使用注解方式使bean的加載順序得到控制;@Order標記定義了組件的加載順序,值越小擁有越高的優先級,可為負數。值越小,越先被加載。
@Order(-1) 優先于 @Order(0)
@Order(1) 優先于 @Order(2)

@Component  //此類一定要交給spring管理
@Order(value=1) //首先執行
public class ConsumerRunnerA implements ApplicationRunner{@Overridepublic void run(ApplicationArgumers args) throws Exception{//代碼System.out.println("需要在springBoot項目啟動時執行的代碼1---");}
}
@Component  //此類一定要交給spring管理
@Order(value=2) //其次執行
public class ConsumerRunnerB implements ApplicationRunner{@Overridepublic void run(ApplicationArgumers args) throws Exception{//代碼System.out.println("需要在springBoot項目啟動時執行的代碼2---");}
}

@Component注解: 將類注入到spring容器中。

參考鏈接:https://blog.csdn.net/hc1285653662/article/details/122445495

2. CommandLineRunner接口

用法:

在容器啟動成功后的最后一步回調(類似開機自啟動)
寫一個類,實現CommandLineRunner接口,將該類注入到Spring容器中;

可以通過@Order注解(屬性指定數字越小表示優先級越高)或者Ordered接口來控制執行順序。

EX:自定義兩個類,實現CommandLineRunner接口,實現run方法,在run方法中添加處理邏輯。

@Order(5)
@Component
public class AppStartReport implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("AppStartReport : 項目成功啟動------------------");}
}
@Order(2)
@Component
public class AppStartReport2 implements CommandLineRunner {@Overridepublic void run(String... args) throws Exception {System.out.println("AppStartReport2 : 項目成功啟動------------------");}
}

啟動效果:AppStartReport2 較AppStartReport 先執行:
在這里插入圖片描述

3. ApplicationRunner接口與CommandLineRunner接口的區別

區別:

  1. CommandLineRunner的方法參數是原始的參數,未做任何處理;
  2. ApplicationRunner的參數為ApplicationArguments對象,是對原始參數的進一步封裝。ApplicationArguments是對參數(主要針對main方法)做了進一步的處理,可以解析–name=value的參數,我們就可根據name獲取value。
@Component
public class AppStartReport3 implements ApplicationRunner {@Overridepublic void run(ApplicationArguments args) throws Exception {System.out.println("AppStartReport3 : 項目成功啟動,參數為: " + Arrays.asList(args.getSourceArgs()));}
}
@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication application = new SpringApplication(App.class);ConfigurableApplicationContext context = application.run("aaa", "bbb");context.close();}
}

自行指定參數后,執行效果如下:
在這里插入圖片描述

也可以在Program arguments選項框設置初始值,“–key=value“形式,如“–argname=ccc”,如下圖所示:
在這里插入圖片描述

@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication application = new SpringApplication(App.class);ConfigurableApplicationContext context = application.run(args);context.close();}
}

啟動器傳入參數為main方法的參數args,效果如下:
在這里插入圖片描述

ApplicationArguments 源碼分析

public interface ApplicationArguments {String[] getSourceArgs();Set<String> getOptionNames();boolean containsOption(String name);List<String> getOptionValues(String name);List<String> getNonOptionArgs();}

資源參數分為兩種,一種是在調用run方法時傳入的(”aaa”,”bbb”),一種是配置的系統參數即main方法的args參數(”ccc”)。

  • 首先getSourceArgs方法,可以獲取到所有參數,可以是自己傳入的參數,也可以是配置的系統參數;

  • getNonOptionArgs方法即可獲得我們傳入的參數(”aaa”,”bbb”)。;

  • 其余3個方法,可獲得系統參數。實際用法如下:
    EX:

@SpringBootApplication
public class App {public static void main(String[] args) {SpringApplication application = new SpringApplication(App.class);ConfigurableApplicationContext context = application.run(args);ApplicationArguments arguments = context.getBean(ApplicationArguments.class);System.out.println("參數個數:" + arguments.getSourceArgs().length);System.out.println("Non OptionArgs:" + arguments.getNonOptionArgs());System.out.println("Option Names:" + arguments.getOptionNames());System.out.println("獲取key為argname的value值:" + arguments.getOptionValues("argname"));System.out.println("是否包含key為argname的參數:" + arguments.containsOption("argname"));context.close();}
}

輸出效果:
在這里插入圖片描述

參考鏈接:https://blog.csdn.net/qq_35006663/article/details/102264172

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/41947.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/41947.shtml
英文地址,請注明出處:http://en.pswp.cn/news/41947.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

vue3+elementUI-plus實現select下拉框的虛擬滾動

網上查了幾個方案&#xff0c;要不就是不兼容&#xff0c;要不就是不支持vue3, 最終找到一個合適的&#xff0c;并且已上線使用&#xff0c;需要修改一下樣式&#xff1a; 代碼如下&#xff1a; main.js里引用 import vue3-virtual-scroller/dist/vue3-virtual-scroller.css; …

xollam勒索病毒數據恢復|金蝶、用友、管家婆、OA、速達、ERP等軟件數據庫恢復

引言&#xff1a; 數字時代的繁榮與便捷&#xff0c;也孕育著各種網絡安全威脅。其中&#xff0c;.xollam勒索病毒以其毒害性和隱蔽性引發了廣泛關注。本文91數據恢復將為您深入解析.xollam勒索病毒的威脅&#xff0c;探討解密方法&#xff0c;同時分享預防.xollam勒索病毒的關…

Python入門教程23:math模塊的用法

**math是Python 的一個內置模塊&#xff0c;它提供了許多數學函數和常量&#xff0c;用于進行數學計算。**以下是一些常用的math模塊中的函數和常量&#xff1a; math.pi&#xff1a;圓周率π的近似值&#xff0c;約等于3.14159。 math.e&#xff1a;自然對數的底數e的近似值…

【Tomcat】(Tomcat 下載Tomcat 啟動Tomcat 簡單部署 基于Tomcat進行網站后端開發)

文章目錄 Tomcat下載Tomcat啟動Tomcat簡單部署 基于Tomcat進行網站后端開發 Tomcat Tomcat 是一個 HTTP 服務器.HTTP 協議就是 HTTP 客戶端和 HTTP 服務器之間的交互數據的格式. HTTP 服務器我們可以通過 Java Socket 來實現. 而 Tomcat 就是基于 Java 實現的一個開源免費,也是…

Python爬蟲:如何使用Python爬取網站數據

更新&#xff1a;2023-08-13 15:30 想要獲取網站的數據&#xff1f;使用Python爬蟲是一個絕佳的選擇。Python爬蟲是通過自動化程序來提取互聯網上的信息。本文章將會詳細介紹Python爬蟲的相關技術。 一、網絡協議和請求 在使用Python爬蟲之前&#xff0c;我們需要理解網絡協…

Synopsys EDA數字設計與仿真

搭建EDA環境 參考如下博文安裝Synopsys EDA開發工具 https://blog.csdn.net/tugouxp/article/details/132255002?csdn_share_tail%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22132255002%22%2C%22source%22%3A%22tugouxp%22%7D Synopsys ED…

【Git】本地搭建Gitee、Github環境

本地 &#xff08;Local&#xff09; 1、使用命令生成公鑰&#xff08;pub文件&#xff09; 1. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "github_id_rsa" 2. $ ssh-keygen -t rsa -C "xxxxxxxemail.com" -f "gitee_id_rsa" …

配置pyqt5開發環境

安裝庫 pip install pyqt5 -i https://mirrors.aliuyun.com/pypi/simple pip install pyqt5-tools -i https://mirrors.aliuyun.com/pypi/simple pip install PyQt5designer -i https://mirrors.aliuyun.com/pypi/simple配置External Tools Name:QtDesigner Program:C:\Anaco…

常見的 JavaScript 框架比較

以下是10種常見的JavaScript框架的比較&#xff1a; React&#xff1a;是由Facebook開發和維護的開源JavaScript庫&#xff0c;用于構建用戶界面。它允許你使用組件來構建復雜的UI&#xff0c;并專注于每個組件的內部邏輯&#xff0c;而不必擔心管理整個應用程序的狀態。WebBu…

使用路由器更改設備IP_跨網段連接PLC

在一些設備IP已經固定,但是需要采集此設備的數據,需要用到跨網段采集 1、將路由器WAN&#xff08;外網撥號口&#xff09;設置為靜態IP 2、設置DMZ主機&#xff0c;把DMZ主機地址設置成跨網段的PLC地址 DMZ主機 基本信息. DMZ (Demilitarized Zone)即俗稱的非軍事區&#xff0…

牛客網華為OD前端崗位,面試題庫練習記錄01

題目一 質數因子 功能:輸入一個正整數&#xff0c;按照從小到大的順序輸出它的所有質因子&#xff08;重復的也要列舉&#xff09;&#xff08;如180的質因子為2 2 3 3 5 &#xff09; JavaScript Node ACM模式 const rl require("readline").createInterface({ i…

IPv4分組

4.3.1 IPv4分組 IP協議定義數據傳送的基本單元——IP分組及其確切的數據格式 1. IPv4分組的格式 IPv4分組由首部和數據部分&#xff08;TCP、UDP段&#xff09;組成&#xff0c;其中首部分為固定部分&#xff08;20字節&#xff09;和可選字段&#xff08;長度可變&#xff0…

1AE4 的魔改混合放大電路

先上電路圖&#xff1a; 最新的1AE4的電路&#xff0c;目標依舊是極致的音效。 因此&#xff0c;為了將1AE4的潛力榨干&#xff0c;采用了一些完全不同的思路&#xff1a; 1&#xff09;原有的屏極接地&#xff0c;因為是一個殼子&#xff0c;所以能起到很好的屏蔽作用&#…

651頁23萬字智慧教育大數據信息化頂層設計及建設方案WORD

導讀&#xff1a;原文《651頁23萬字智慧教育大數據信息化頂層設計及建設方案WORD》&#xff08;獲取來源見文尾&#xff09;&#xff0c;本文精選其中精華及架構部分&#xff0c;邏輯清晰、內容完整&#xff0c;為快速形成售前方案提供參考。 目錄 一、 方案背景 1.1 以教育…

微信開發之一鍵獲取好友詳情的技術實現

簡要描述&#xff1a; 獲取聯系人信息 請求URL&#xff1a; http://域名地址/getContact 請求方式&#xff1a; POST 請求頭Headers&#xff1a; Content-Type&#xff1a;application/jsonAuthorization&#xff1a;login接口返回 參數&#xff1a; 參數名必選類型說…

LaWGPT基于中文法律知識的大語言模型_初步安裝

準備代碼&#xff0c;創建環境 # 下載代碼 git clone gitgithub.com:pengxiao-song/LaWGPT.git cd LaWGPT# 創建環境 conda create -n lawgpt python3.10 -y conda activate lawgpt國內網絡環境問題。你可以把requirements.txt里面的github.com替換成kgithub.com&#xff08;這…

go 協程并發數控制

錯誤的寫法&#xff1a; 這里的<-ch 是為了從channel 中讀取 數據&#xff0c;為了不使channel通道被寫滿&#xff0c;阻塞 go 協程數的創建。但是請注意&#xff0c;go workForDraw(v, &wg) 是不阻塞后續的<-ch 執行的&#xff0c;所以就一直go workForDraw(v, &…

使用 NLP 進行文本摘要

一、說明 文本摘要是為較長的文本文檔生成簡短、流暢且最重要的是準確摘要的過程。自動文本摘要背后的主要思想是能夠從整個集合中找到最重要信息的一小部分&#xff0c;并以人類可讀的格式呈現。隨著在線文本數據的增長&#xff0c;自動文本摘要方法可能會非常有用&#xff0c…

C語言好題解析(一)

目錄 選擇題1選擇題2選擇題3選擇題4編程題一 選擇題1 執行下面程序&#xff0c;正確的輸出是&#xff08; &#xff09;int x 5, y 7; void swap() {int z;z x;x y;y z; } int main() {int x 3, y 8;swap();printf("%d,%d\n",x, y);return 0; }A: 5,7 B: …

H5前端外包開發框架排名

以下是一些常見的網頁前端開發框架以及它們的排名和特點。請注意&#xff0c;隨著時間的推移&#xff0c;框架的排名和特點可能會有所變化。不同的項目和團隊對于框架的選擇會受到多個因素的影響&#xff0c;包括開發團隊的技能、項目的規模和要求、性能需求等。北京木奇移動技…