成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Spring多種啟動初始化方案,看這篇就夠了

開發 架構
我們經常有一些業務需求,需要在項目啟動后執行相關的業務代碼,如:數據的初始化業務。今天我們來梳理一下有哪些方案?

[[410656]]

目錄

  • 前言
  • CommandLineRunner
  • ApplicationRunner
  • ApplicationListener
  • @PostConstruct
  • InitializationBean
  • 總結

前言

我們經常有一些業務需求,需要在項目啟動后執行相關的業務代碼,如:數據的初始化業務。今天我們來梳理一下有哪些方案?

CommandLineRunner

CommandLineRunner是一個接口,通過實現它,我們可以在Spring應用成功啟動之后執行一些代碼片段

我們先定義個User實體Bean

 

Spring多種啟動初始化方案,看這篇就夠了

 

下面我們定義一個類實現CommandLineRunner接口

 

Spring多種啟動初始化方案,看這篇就夠了

 

當 Spring Boot 在應用上下文中找到 CommandLineRunner bean,它將會在應用成功啟動之后調用 run() 方法,并傳遞用于啟動應用程序的命令行參數

java -jar demo-0.0.1-SNAPSHOT.jar --foo=bar --name=gujch

啟動執行結果

 

Spring多種啟動初始化方案,看這篇就夠了

 

小結:

  1. 命令行傳入的參數并沒有被解析,而只是顯示出我們傳入的字符串內容 --foo=bar,--name=gujch
  2. 在重寫的 run() 方法上有 throws Exception 標記,Spring Boot 會將 CommandLineRunner 作為應用啟動的一部分,如果運行 run() 方法時拋出 Exception,應用將會終止啟動
  3. 當有多個 CommandLineRunner 時,將會按照 @Order 注解中的數字從小到大

如果我們只是想簡單的獲取以空格分隔的命令行參數,那 MyCommandLineRunner 就足夠使用了

ApplicationRunner

上面提到,通過命令行啟動并傳遞參數,MyCommandLineRunner 不能解析參數,如果要解析參數,那我們就要用到 ApplicationRunner 參數了

 

Spring多種啟動初始化方案,看這篇就夠了

 

執行結果

 

Spring多種啟動初始化方案,看這篇就夠了

 

到這里我們可以看出:

同 MyCommandLineRunner 相似,但 ApplicationRunner 可以通過 run 方法的 ApplicationArguments 對象解析出命令行參數,并且每個參數可以有多個值在里面,因為 getOptionValues 方法返回 List數組

在重寫的 run() 方法上有 throws Exception 標記,Spring Boot 會將 ApplicationRunner 作為應用啟動的一部分,如果運行 run() 方法時拋出 Exception,應用將會終止啟動

ApplicationRunner 也可以使用 @Order 注解進行排序,從啟動結果來看,它與 CommandLineRunner 共享 order 的順序

我們來看看源碼,CommandLineRunner 和 ApplicationRunner 是在何時被調用的呢?

SpringApplication.java類中callRunners方法

 

Spring多種啟動初始化方案,看這篇就夠了

 

上面可以看到spring獲取CommandLineRunner 和 ApplicationRunner Bean會放到List中,然后一起排序,所以@Order排序是共享的

ApplicationListener

如果我們不需要獲取命令行參數時,我們可以將啟動邏輯綁定到 Spring 的 ApplicationReadyEvent 上

 

Spring多種啟動初始化方案,看這篇就夠了

 

執行結果

 

Spring多種啟動初始化方案,看這篇就夠了

 

ApplicationReadyEvent 當且僅當 在應用程序就緒之后才被觸發。

啟動順序Order不與CommandLineRunner和ApplicationRunner共享

如果我們不需要獲取命令行參數,我們可以通過 ApplicationListener 創建一些全局的啟動邏輯,我們還可以通過它獲取 Spring Boot 支持的 configuration properties 環境變量參數 ,因為event參數有configuration上下文

 

Spring多種啟動初始化方案,看這篇就夠了

 

@PostConstruct

創建啟動邏輯的另一種簡單解決方案是提供一種在 bean 創建期間由 Spring 調用的初始化方法。我們要做的就只是將 @PostConstruct 注解添加到方法中:

 

Spring多種啟動初始化方案,看這篇就夠了

 

執行結果

 

Spring多種啟動初始化方案,看這篇就夠了

 

從上面運行結果可以看出:

1)Spring 創建完 bean之后 (在啟動之前),便會立即調用 @PostConstruct 注解標記的方法,因此我們無法使用 @Order 注解對其進行自由排序,因為它可能依賴于 @Autowired插入到我們 bean 中的其他 Spring bean。

2)相反,它將在依賴于它的所有 bean 被初始化之后被調用

@PostConstruct 方法固有地綁定到現有的 Spring bean,因此應僅將其用于此單個 bean 的初始化邏輯;

@PostConstruct應用場景:

在生成對象時候做一些初始化操作,而這些初始化操作又依賴于依賴注入(populateBean),那么就無法在構造函數中實現。這時,可以使用@PostConstruct注解一個方法來完成初始化,@PostConstruct注解的方法將會在依賴注入完成后被自動調用。

InitializingBean

與 @PostConstruct 解決方案非常相似,我們可以實現 InitializingBean 接口,并讓 Spring 調用某個初始化方法:

 

Spring多種啟動初始化方案,看這篇就夠了

 

執行結果

 

Spring多種啟動初始化方案,看這篇就夠了

 

@PostConstruct 和 afterPropertiesSet 區別

1、afterPropertiesSet,顧名思義「在屬性設置之后」,調用該方法時,該 bean 的所有屬性已經被 Spring 填充。如果我們在某些屬性上使用 @Autowired(常規操作應該使用構造函數注入),那么 Spring 將在調用afterPropertiesSet 之前將 bean 注入這些屬性。但 @PostConstruct 并沒有這些屬性填充限制

2、所以

InitializingBean.afterPropertiesSet 解決方案比使用 @PostConstruct 更安全,因為如果我們依賴尚未自動注入的 @Autowired 字段,則 @PostConstruct 方法可能會遇到 NullPointerExceptions

總結

從上面的例子中我們就可以發現各個啟動方案的順序

針對Bean實體啟動初始化 順序

Construct >> @Autowired(依賴注入) >> @postConstruct >> InitializingBean

針對整體項目啟動 順序

 

CommandLineRunner和ApplicationRunner >> ApplicationListener

 

責任編輯:武曉燕 來源: 今日頭條
相關推薦

2024-08-27 11:00:56

單例池緩存bean

2017-03-30 22:41:55

虛擬化操作系統軟件

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協議TCP

2021-05-07 07:52:51

Java并發編程

2022-03-29 08:23:56

項目數據SIEM

2020-09-18 16:37:59

數據可視化技術Python

2025-02-18 16:00:00

SpringBoot支付Java

2023-09-25 08:32:03

Redis數據結構

2023-11-07 07:46:02

GatewayKubernetes

2021-09-10 13:06:45

HDFS底層Hadoop

2023-10-04 00:32:01

數據結構Redis

2021-07-28 13:29:57

大數據PandasCSV

2021-10-21 06:52:17

ZooKeeper分布式配置

2023-12-07 09:07:58

2018-09-26 11:02:46

微服務架構組件

2021-04-11 08:30:40

VRAR虛擬現實技術

2022-08-18 20:45:30

HTTP協議數據

2021-11-10 07:47:48

Traefik邊緣網關

2021-12-13 10:43:45

HashMapJava集合容器
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩三区 | 中文字幕成人网 | 日韩国产在线 | 亚洲精品毛片av | 亚洲国产成人精品女人久久久 | 性色av一区二区三区 | 国产精品99久久久久久久久久久久 | 国产精品免费一区二区三区 | 成年免费在线观看 | 国产免费一区二区 | 午夜资源 | 99热这里有精品 | 国内久久 | a级黄色毛片免费播放视频 国产精品视频在线观看 | 久热精品在线观看视频 | 麻豆av一区二区三区久久 | 国产精品亚洲综合 | 欧美激情视频一区二区三区在线播放 | 中文字幕在线网 | 亚洲精品一区二区网址 | 国产精品日韩欧美一区二区 | 黑人一级黄色大片 | 成人在线一区二区 | 久久久精品一区二区 | 天天射影院 | 色婷婷一区| 午夜日韩| www.久| 中文字幕综合 | 欧美啊v在线观看 | 成人精品一区二区 | 日本一区二区不卡 | 99色在线视频 | 国产在线精品一区二区三区 | 精品国产久 | 亚洲欧美日韩在线不卡 | 精品一二区 | 日韩欧美在线一区 | 欧美日韩不卡合集视频 | 99精品欧美一区二区三区综合在线 | 天天综合网7799精品 |