解決@PostConstruct注解導(dǎo)致的程序無法啟動(dòng)(@PostConstruct的執(zhí)行)
樓主遇到一個(gè)問題,問題大概是這樣的
問題
1、業(yè)務(wù)原因,需要程序初始化啟動(dòng)后自動(dòng)執(zhí)行一個(gè)程序,這個(gè)程序處在一個(gè)死循環(huán)內(nèi),不會(huì)結(jié)束,保持自動(dòng)執(zhí)行
2、程序啟動(dòng)后,其他所有接口無法調(diào)用
處理及結(jié)果
然后我開始排查啊,排查啊
我先嘗試重啟服務(wù),重新清空IDE的緩存,重啟電腦,換環(huán)境執(zhí)行,結(jié)果都不行
然后我在每個(gè)方法都打了斷點(diǎn),開始執(zhí)行,這個(gè)時(shí)候問題開始露頭
我發(fā)現(xiàn)它走了@PostConstruct注解的方法,但是我這個(gè)方法是個(gè)死循環(huán),不會(huì)結(jié)束的?。?!
我大膽猜測,是否是因?yàn)锧PostConstruct注解的方法未結(jié)束,導(dǎo)致的無法執(zhí)行
于是我寫了一個(gè)測試工程,進(jìn)行測試,結(jié)果復(fù)現(xiàn)了這個(gè)問題!?。。。。?/p>
我查閱了一下資料,大概明白了問題所在:
springboot啟動(dòng)過程
springboot的bean加載的過程是這樣的,程序啟動(dòng)時(shí),springboot會(huì)把標(biāo)記為bean的類或者接口自動(dòng)進(jìn)行全局的單例實(shí)例化,如果用戶指定標(biāo)記了初始化的順序,springboot則會(huì)按照用戶指定的順序進(jìn)行初始化,否則就會(huì)按照默認(rèn)的順序進(jìn)行初始化,在這個(gè)過程中,如果一個(gè)bean所在的類或者接口存在@PostConstruct注解,springboot就會(huì)在執(zhí)行完這個(gè)bean的構(gòu)造方法之后執(zhí)行標(biāo)記有@PostConstruct注解的方法,然后實(shí)例化下一個(gè)bean
如果說,帶有@PostConstruct注解的方法執(zhí)行時(shí)間很長,那就會(huì)影響springboot對bean的實(shí)例化時(shí)間,進(jìn)而就會(huì)間接影響到程序的初始化啟動(dòng),如果springboot不初始化完bean,是不會(huì)打開端口提供服務(wù)的,所以在@PostConstruct注解的方法執(zhí)行完之前,應(yīng)用不可訪問
所以說,對于輕量級的邏輯,可以放在@PostConstruct注解的方法里,非常耗時(shí)的邏輯,可以考慮使用多線程處理,也可以放棄@PostConstruct注解,改用CommandLineRunner和ApplicationRunner
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
一文帶你了解Java創(chuàng)建型設(shè)計(jì)模式之原型模式
原型模式其實(shí)就是從一個(gè)對象在創(chuàng)建另外一個(gè)可定制的對象,不需要知道任何創(chuàng)建的細(xì)節(jié)。本文就來通過示例為大家詳細(xì)聊聊原型模式,需要的可以參考一下2022-09-09
在SpringBoot接口中正確地序列化時(shí)間字段的方法
文章主要介紹在 Spring Boot 接口中正確序列化時(shí)間字段的方法,包括 Java 中Date和LocalDateTime類型的區(qū)別,JSON 序列化和請求參數(shù)中時(shí)間字段的處理,如時(shí)間字符串的格式配置、時(shí)間戳的使用及相關(guān)配置,還提到了在 Swagger UI 中的類型設(shè)置,需要的朋友可以參考下2024-11-11
SpringBoot業(yè)務(wù)邏輯異常的處理方法介紹
本篇文章為大家展示了如何在SpringBoot中統(tǒng)一處理邏輯異常,內(nèi)容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲2022-09-09
分別在Groovy和Java中創(chuàng)建并初始化映射的不同分析
這篇文章主要為大家介紹了分別在Groovy和Java中創(chuàng)建并初始化映射的不同分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-03-03
利用logback filter過濾某個(gè)類 屏蔽某個(gè)類
這篇文章主要介紹了利用logback filter過濾某個(gè)類 屏蔽某個(gè)類的操作,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07

