自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Spring多種啟動(dòng)初始化方案,看這篇就夠了

開(kāi)發(fā) 架構(gòu)
我們經(jīng)常有一些業(yè)務(wù)需求,需要在項(xiàng)目啟動(dòng)后執(zhí)行相關(guān)的業(yè)務(wù)代碼,如:數(shù)據(jù)的初始化業(yè)務(wù)。今天我們來(lái)梳理一下有哪些方案?

[[410656]]

目錄

  • 前言
  • CommandLineRunner
  • ApplicationRunner
  • ApplicationListener
  • @PostConstruct
  • InitializationBean
  • 總結(jié)

前言

我們經(jīng)常有一些業(yè)務(wù)需求,需要在項(xiàng)目啟動(dòng)后執(zhí)行相關(guān)的業(yè)務(wù)代碼,如:數(shù)據(jù)的初始化業(yè)務(wù)。今天我們來(lái)梳理一下有哪些方案?

CommandLineRunner

CommandLineRunner是一個(gè)接口,通過(guò)實(shí)現(xiàn)它,我們可以在Spring應(yīng)用成功啟動(dòng)之后執(zhí)行一些代碼片段

我們先定義個(gè)User實(shí)體Bean

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

下面我們定義一個(gè)類實(shí)現(xiàn)CommandLineRunner接口

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

當(dāng) Spring Boot 在應(yīng)用上下文中找到 CommandLineRunner bean,它將會(huì)在應(yīng)用成功啟動(dòng)之后調(diào)用 run() 方法,并傳遞用于啟動(dòng)應(yīng)用程序的命令行參數(shù)

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

啟動(dòng)執(zhí)行結(jié)果

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

小結(jié):

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

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

ApplicationRunner

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

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

執(zhí)行結(jié)果

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

到這里我們可以看出:

同 MyCommandLineRunner 相似,但 ApplicationRunner 可以通過(guò) run 方法的 ApplicationArguments 對(duì)象解析出命令行參數(shù),并且每個(gè)參數(shù)可以有多個(gè)值在里面,因?yàn)?getOptionValues 方法返回 List數(shù)組

在重寫(xiě)的 run() 方法上有 throws Exception 標(biāo)記,Spring Boot 會(huì)將 ApplicationRunner 作為應(yīng)用啟動(dòng)的一部分,如果運(yùn)行 run() 方法時(shí)拋出 Exception,應(yīng)用將會(huì)終止啟動(dòng)

ApplicationRunner 也可以使用 @Order 注解進(jìn)行排序,從啟動(dòng)結(jié)果來(lái)看,它與 CommandLineRunner 共享 order 的順序

我們來(lái)看看源碼,CommandLineRunner 和 ApplicationRunner 是在何時(shí)被調(diào)用的呢?

SpringApplication.java類中callRunners方法

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

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

ApplicationListener

如果我們不需要獲取命令行參數(shù)時(shí),我們可以將啟動(dòng)邏輯綁定到 Spring 的 ApplicationReadyEvent 上

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

執(zhí)行結(jié)果

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

ApplicationReadyEvent 當(dāng)且僅當(dāng) 在應(yīng)用程序就緒之后才被觸發(fā)。

啟動(dòng)順序Order不與CommandLineRunner和ApplicationRunner共享

如果我們不需要獲取命令行參數(shù),我們可以通過(guò) ApplicationListener 創(chuàng)建一些全局的啟動(dòng)邏輯,我們還可以通過(guò)它獲取 Spring Boot 支持的 configuration properties 環(huán)境變量參數(shù) ,因?yàn)閑vent參數(shù)有configuration上下文

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

@PostConstruct

創(chuàng)建啟動(dòng)邏輯的另一種簡(jiǎn)單解決方案是提供一種在 bean 創(chuàng)建期間由 Spring 調(diào)用的初始化方法。我們要做的就只是將 @PostConstruct 注解添加到方法中:

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

執(zhí)行結(jié)果

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

從上面運(yùn)行結(jié)果可以看出:

1)Spring 創(chuàng)建完 bean之后 (在啟動(dòng)之前),便會(huì)立即調(diào)用 @PostConstruct 注解標(biāo)記的方法,因此我們無(wú)法使用 @Order 注解對(duì)其進(jìn)行自由排序,因?yàn)樗赡芤蕾囉?@Autowired插入到我們 bean 中的其他 Spring bean。

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

@PostConstruct 方法固有地綁定到現(xiàn)有的 Spring bean,因此應(yīng)僅將其用于此單個(gè) bean 的初始化邏輯;

@PostConstruct應(yīng)用場(chǎng)景:

在生成對(duì)象時(shí)候做一些初始化操作,而這些初始化操作又依賴于依賴注入(populateBean),那么就無(wú)法在構(gòu)造函數(shù)中實(shí)現(xiàn)。這時(shí),可以使用@PostConstruct注解一個(gè)方法來(lái)完成初始化,@PostConstruct注解的方法將會(huì)在依賴注入完成后被自動(dòng)調(diào)用。

InitializingBean

與 @PostConstruct 解決方案非常相似,我們可以實(shí)現(xiàn) InitializingBean 接口,并讓 Spring 調(diào)用某個(gè)初始化方法:

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

執(zhí)行結(jié)果

 

Spring多種啟動(dòng)初始化方案,看這篇就夠了

 

@PostConstruct 和 afterPropertiesSet 區(qū)別

1、afterPropertiesSet,顧名思義「在屬性設(shè)置之后」,調(diào)用該方法時(shí),該 bean 的所有屬性已經(jīng)被 Spring 填充。如果我們?cè)谀承傩陨鲜褂?@Autowired(常規(guī)操作應(yīng)該使用構(gòu)造函數(shù)注入),那么 Spring 將在調(diào)用afterPropertiesSet 之前將 bean 注入這些屬性。但 @PostConstruct 并沒(méi)有這些屬性填充限制

2、所以

InitializingBean.afterPropertiesSet 解決方案比使用 @PostConstruct 更安全,因?yàn)槿绻覀円蕾嚿形醋詣?dòng)注入的 @Autowired 字段,則 @PostConstruct 方法可能會(huì)遇到 NullPointerExceptions

總結(jié)

從上面的例子中我們就可以發(fā)現(xiàn)各個(gè)啟動(dòng)方案的順序

針對(duì)Bean實(shí)體啟動(dòng)初始化 順序

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

針對(duì)整體項(xiàng)目啟動(dòng) 順序

 

CommandLineRunner和ApplicationRunner >> ApplicationListener

 

責(zé)任編輯:武曉燕 來(lái)源: 今日頭條
相關(guān)推薦

2024-08-27 11:00:56

單例池緩存bean

2017-03-30 22:41:55

虛擬化操作系統(tǒng)軟件

2021-09-30 07:59:06

zookeeper一致性算法CAP

2019-08-16 09:41:56

UDP協(xié)議TCP

2021-05-07 07:52:51

Java并發(fā)編程

2022-03-29 08:23:56

項(xiàng)目數(shù)據(jù)SIEM

2020-09-18 16:37:59

數(shù)據(jù)可視化技術(shù)Python

2025-02-18 16:00:00

SpringBoot支付Java

2021-09-10 13:06:45

HDFS底層Hadoop

2023-09-25 08:32:03

Redis數(shù)據(jù)結(jié)構(gòu)

2023-10-04 00:32:01

數(shù)據(jù)結(jié)構(gòu)Redis

2023-11-07 07:46:02

GatewayKubernetes

2021-07-28 13:29:57

大數(shù)據(jù)PandasCSV

2021-04-11 08:30:40

VRAR虛擬現(xiàn)實(shí)技術(shù)

2018-09-26 11:02:46

微服務(wù)架構(gòu)組件

2021-10-21 06:52:17

ZooKeeper分布式配置

2021-11-10 07:47:48

Traefik邊緣網(wǎng)關(guān)

2022-08-18 20:45:30

HTTP協(xié)議數(shù)據(jù)

2023-12-07 09:07:58

2023-11-22 07:54:33

Xargs命令Linux
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)