解決@PostConstruct注解導(dǎo)致的程序無法啟動(@PostConstruct的執(zhí)行)
樓主遇到一個問題,問題大概是這樣的
問題
1、業(yè)務(wù)原因,需要程序初始化啟動后自動執(zhí)行一個程序,這個程序處在一個死循環(huán)內(nèi),不會結(jié)束,保持自動執(zhí)行
2、程序啟動后,其他所有接口無法調(diào)用
處理及結(jié)果
然后我開始排查啊,排查啊
我先嘗試重啟服務(wù),重新清空IDE的緩存,重啟電腦,換環(huán)境執(zhí)行,結(jié)果都不行
然后我在每個方法都打了斷點,開始執(zhí)行,這個時候問題開始露頭
我發(fā)現(xiàn)它走了@PostConstruct注解的方法,但是我這個方法是個死循環(huán),不會結(jié)束的?。。?/p>
我大膽猜測,是否是因為@PostConstruct注解的方法未結(jié)束,導(dǎo)致的無法執(zhí)行
于是我寫了一個測試工程,進行測試,結(jié)果復(fù)現(xiàn)了這個問題!?。。。?!
我查閱了一下資料,大概明白了問題所在:
springboot啟動過程
springboot的bean加載的過程是這樣的,程序啟動時,springboot會把標(biāo)記為bean的類或者接口自動進行全局的單例實例化,如果用戶指定標(biāo)記了初始化的順序,springboot則會按照用戶指定的順序進行初始化,否則就會按照默認(rèn)的順序進行初始化,在這個過程中,如果一個bean所在的類或者接口存在@PostConstruct注解,springboot就會在執(zhí)行完這個bean的構(gòu)造方法之后執(zhí)行標(biāo)記有@PostConstruct注解的方法,然后實例化下一個bean
如果說,帶有@PostConstruct注解的方法執(zhí)行時間很長,那就會影響springboot對bean的實例化時間,進而就會間接影響到程序的初始化啟動,如果springboot不初始化完bean,是不會打開端口提供服務(wù)的,所以在@PostConstruct注解的方法執(zhí)行完之前,應(yīng)用不可訪問
所以說,對于輕量級的邏輯,可以放在@PostConstruct注解的方法里,非常耗時的邏輯,可以考慮使用多線程處理,也可以放棄@PostConstruct注解,改用CommandLineRunner和ApplicationRunner
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
詳解Java多線程編程中LockSupport類的線程阻塞用法
LockSupport類提供了park()和unpark()兩個方法來實現(xiàn)線程的阻塞和喚醒,下面我們就來詳解Java多線程編程中LockSupport類的線程阻塞用法:2016-07-07SpringBoot中yml的數(shù)據(jù)綁定示例
本文主要介紹了SpringBoot中yml的數(shù)據(jù)綁定示例,借助于YAML的簡潔語法和結(jié)構(gòu)化特性,我們能夠輕松地管理應(yīng)用程序的配置信息,使得配置文件更加清晰易讀,感興趣的可以了解一下2023-11-11Java之Springcloud Gateway內(nèi)置路由案例講解
這篇文章主要介紹了Java之Springcloud Gateway內(nèi)置路由案例講解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-08-08java報錯之springboot3+vue2項目web服務(wù)層報錯總結(jié)
java入門學(xué)習(xí),隨手記錄一下開發(fā)過程中產(chǎn)生的報錯,有些錯誤是網(wǎng)上搜索再加上自己嘗試,隨手引用了一些其他人的記錄,也是留給自己看的,或是希望能對其他初學(xué)者有幫助2023-06-06SpringBoot使用Sharding-JDBC實現(xiàn)數(shù)據(jù)分片和讀寫分離的方法
本文主要介紹了SpringBoot使用Sharding-JDBC實現(xiàn)數(shù)據(jù)分片和讀寫分離,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-10-10