首页
/
每日頭條
/
科技
/
spring boot運行流程
spring boot運行流程
更新时间:2026-05-06 13:43:28
1.本篇前言

在日常開發中,我們經常會遇到在項目啟動階段要做一些數據初始化等操作,并且隻在項目啟動時進行,後續不再執行。而在SpringBoot2.x中,可根據不同使用場景使用不同的方式去實現該功能。具體如下:

  • 實現CommandLineRunner接口
  • 實現ApplicationRunner接口
  • 實現ApplicationListener接口
  • 使用@PostConstruct 注解
  • 實現InitializingBean接口
  1. CommandLineRunner、ApplicationRunner 接口是在容器啟動成功後的最後一步回調(類似開機自啟動)。區别在于接收的參數不一樣。CommandLineRunner 的參數是最原始的參數,沒有做任何處理。ApplicationRunner的參數是ApplicationArguments,是對原始參數做了進一步的封裝。
  2. 使用ApplicationListener,定義一個 ServletContextListener,然後監聽項目啟動和銷毀,在contextInitialized方式中編寫初始化業務邏輯即可。
  3. 使用 @PostConstruct 注解同樣可以幫助我們完成資源的初始化操作,前提是這些初始化操作不需要依賴于其它Spring beans的初始化工作。

啟動任務常用場景:

  • 數據初始化
  • 初始化系統參數
  • 文件初始化
  • 緩存初始化
2.代碼實現2.1 基于 CommandLineRunner 實現
  1. 定義 InitCommandLineRunner 并且實現 CommandLineRunner 接口
  2. 首先通過 @Component 注解将 InitCommandLineRunner 注冊為Spring容器中的一個 Bean。
  3. 添加 @Order 注解,表示這個啟動任務的執行優先級,因為在一個項目中,啟動任務可能有多個,所以需要有一個排序。@Order 注解中,數字越小,優先級越大,默認情況下,優先級的值為 Integer.MAX_VALUE,表示優先級最低。
  4. 在 run 方法中,編寫啟動任務的核心邏輯,當項目啟動時,run方法會被自動執行。run 方法的參數,來自于項目的啟動參數,即項目入口類中,main方法的參數會被傳到這裡

/** * 功能描述: CommandLineRunner實現啟動任務 * @author TuYong * @date 2022/6/14 14:16 */ @Component @Order(100) @Slf4j public class InitCommandLineRunner implements CommandLineRunner { @Override public void run(String... args) throws Exception { log.info("讀取String數組參數初始化操作内容..."); } }

測試結果如下:在 IDEA 中,可以通過如下方式來配置參數

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)1

啟動項目後,我們可以看到啟動過程中run方式被執行。

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)2

2.2 基于 ApplicationRunner 實現

代碼如下,自定義類InitApplicationRunner實現 ApplicationRunner 接口即可。用法同CommandLineRunner一緻,ApplicationRunner 可以接收更多類型的參數(ApplicationRunner 除了可以接收 CommandLineRunner 的參數之外,還可以接收 key/value 形式的參數)。具體獲取參數方法如下:

  • args.getNonOptionArgs();用來獲取命令行中的無key參數(和CommandLineRunner一樣)。
  • args.getOptionNames();用來獲取所有key/value形式的參數的key。
  • args.getOptionValues(key));根據key獲取key/value 形式的參數的value。
  • args.getSourceArgs(); 獲取命令行中的所有參數。

/** * 功能描述: ApplicationRunner實現啟動任務 * @author TuYong * @date 2022/6/14 14:31 */ @Component @Order(99) @Slf4j public class InitApplicationRunner implements ApplicationRunner { @Override public void run(ApplicationArguments args) throws Exception { //獲取命令行中的無key參數 List<String> nonOptionArgs = args.getNonOptionArgs(); log.info("InitApplicationRunner無key參數:{}",nonOptionArgs); //獲取所有key/value形式的參數的key Set<String> optionNames = args.getOptionNames(); for (String key : optionNames) { //根據key獲取key/value 形式的參數的value log.info("InitApplicationRunner有key參數:{}",args.getOptionValues(key)); } //獲取命令行中的所有參數 String[] sourceArgs = args.getSourceArgs(); log.info("InitApplicationRunner所有參數:{}",Arrays.toString(sourceArgs)); } }

測試結果如下:在 IDEA 中,可以通過如下方式來配置參數

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)3

啟動項目,可以看到控制台打印如下:

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)4

2.3 基于 ApplicationListener 實現

定義義一個 ServletContextListener,在contextInitialized方法中進行數據初始化操作即可。

@Component @Slf4j public class InitServletContextListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { //這裡編寫啟動任務代碼 log.info("監聽器初始化....."); } }

測試結果如下:

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)5

2.4 基于@PostConstruct注解實現

示例代碼如下,被@PostConstruct修飾的方法會在服務器加載Servlet的時候運行,并且隻會被服務器執行一次。創建bean的時候執行順序Constructor(構造方法) -> @Autowired(依賴注入) -> @PostConstruct(注釋的方法)

需要注意的是:

  • 在spring創建bean的時候觸發,此時容器還未完全初始化完畢,如果邏輯中引用了還未完成初始化的bean會導緻異常 ,所以需要考慮加載順序
  • 如果@PostConstruct方法内的邏輯處理時間較長,就會增加SpringBoot應用初始化Bean的時間,進而增加應用啟動的時間。因為隻有在Bean初始化完成後,SpringBoot應用才會打開端口提供服務,所以在此之前,應用不可訪問

/** * 功能描述: 基于@PostConstruct實現啟動任務 * @author TuYong * @date 2022/6/14 14:59 */ @Service @Slf4j public class SysParamService { @PostConstruct public void initParam(){ //編寫業務邏輯代碼,比如從數據庫查詢系統參數放入緩存中 log.info("初始化系統參數......"); } }

測試結果如下

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)6

2.5 基于 InitializingBean 實現

示例代碼如下:

/** * 功能描述: 基于InitializingBean實現啟動任務 * @author TuYong * @date 2022/6/14 15:25 */ @Component @Slf4j public class MyInitializingBean implements InitializingBean { @Override public void afterPropertiesSet() throws Exception { //編寫啟動任務代碼 log.info("InitializingBean 執行初始化任務..."); } }

測試結果如下

spring boot運行流程(進階篇-SpringBoot2.x系統啟動任務)7

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
科學計算器使用教程 三角函數
科學計算器使用教程 三角函數
Windows10系統中内置的計算器,不僅能夠幫助你進行簡單的數學運算,而且内置的高級模式還能完成更加複雜的計算。不過此前科學模式僅能計算簡單的數學函數,而在近期的版本更新中能夠處理三角函數、統計信息和其他高級數學問題。微軟目前已經開始部署...
2026-05-06
電腦上怎麼做表格
電腦上怎麼做表格
電腦上怎麼做表格?打開【wps客戶端】,點擊【新建】-【表格】,現在小編就來說說關于電腦上怎麼做表格?下面内容希望能幫助到你,我們來一起看看吧!電腦上怎麼做表格打開【wps客戶端】,點擊【新建】-【表格】。選擇創建新的【空白表格】,雙擊輸入...
2026-05-06
excel按條件提取數據
excel按條件提取數據
excel按條件提取數據?輸入到一起的數據可以分别快速提取,今天小編就來聊一聊關于excel按條件提取數據?接下來我們就一起去研究一下吧!excel按條件提取數據輸入到一起的數據可以分别快速提取。輸入要提取的數據。按“Ctrl+E”即可快速...
2026-05-06
toto高端智能馬桶怎麼選
toto高端智能馬桶怎麼選
智能坐便器的普及與使用正在成為一種潮流,越來越多的家庭開始使用這樣的潔具産品。傳統的馬桶快速的消亡,新一代的智能坐便器産品快速的取代傳統馬桶的位置。很多人在面對智能坐便器這樣的新事物的時候也許會問,智能坐便器好用嗎?它的答案是顯而易見的,緒...
2026-05-06
寶馬概念型電動摩托車
寶馬概念型電動摩托車
易車訊寶馬官網日前發布新聞,将為品牌摩托車提供全新ACC主動巡航控制系統。該系統由寶馬和博世聯合研發,摩托車駕駛員使用該系統時,無需人為适應前方車速。寶馬即将為摩托車提供這種騎行輔助系統,從而提高摩托車的駕駛舒适體驗。寶馬摩托車提供全新AC...
2026-05-06
Copyright 2023-2026 - www.tftnews.com All Rights Reserved