日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Spring多種啟動初始化方案,看這篇就夠了

[[410656]]

目錄

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

前言

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

梁平網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、成都響應(yīng)式網(wǎng)站建設(shè)等網(wǎng)站項目制作,到程序開發(fā),運營維護。創(chuàng)新互聯(lián)于2013年創(chuàng)立到現(xiàn)在10年的時間,我們擁有了豐富的建站經(jīng)驗和運維經(jīng)驗,來保證我們的工作的順利進行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。

CommandLineRunner

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

我們先定義個User實體Bean

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

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

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

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

小結(jié):

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

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

ApplicationRunner

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

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

到這里我們可以看出:

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

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

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

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

SpringApplication.java類中callRunners方法

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

ApplicationListener

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

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

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

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

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

@PostConstruct

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

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

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

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

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

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

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

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

InitializingBean

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

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

@PostConstruct 和 afterPropertiesSet 區(qū)別

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

2、所以

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

總結(jié)

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

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

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

針對整體項目啟動 順序

CommandLineRunner和ApplicationRunner >> ApplicationListener


文章題目:Spring多種啟動初始化方案,看這篇就夠了
本文網(wǎng)址:http://www.5511xx.com/article/dpscpph.html