SpringBoot中SmartLifecycle的使用解析
前言
SmartLifecycle是一個(gè)擴(kuò)展了Lifecycle接口,可以跟蹤spring容器ApplicationContext刷新或者關(guān)閉的接口,實(shí)現(xiàn)該接口的實(shí)現(xiàn)類有特定的執(zhí)行順序。
當(dāng)ApplicationContext刷新時(shí),所有bean都加載和初始化完成后,根據(jù)isAutoStartup和isRunning判斷是否自動(dòng)執(zhí)行start()
1.新建TestSmartLifecycle類
public class TestSmartLifecycle implements SmartLifecycle { @Override public void start() { System.out.println("TestSmartLifecycle is start"); } //SmartLifecycle組件停止后的回調(diào),程序被異步關(guān)閉 @Override public void stop() { System.out.println("SmartLifecycle is stop"); } //為false,并且isAutoStartup為true,執(zhí)行start方法 //為true,執(zhí)行stop方法。 @Override public boolean isRunning() { return false; } //如果為true,實(shí)現(xiàn)了SmartLifecycle 接口的組件,能再ApplicationContext已經(jīng)刷新的時(shí)候,自動(dòng)執(zhí)行start方法, @Override public boolean isAutoStartup() { return true; } //當(dāng)running為true時(shí),再應(yīng)用關(guān)閉時(shí)會(huì)執(zhí)行stop(Runnable callback)方法, 如果再執(zhí)行完stop后,running沒(méi)有設(shè)置為false時(shí),應(yīng)用會(huì)卡住一段時(shí)間,無(wú)法退出 @Override public void stop(Runnable callback) { System.out.println("TestSmartLifecycle is stop"); callback.run(); } @Override public int getPhase() { return 0; } }
2.配置Bean
@Configuration public class TestConfiguration { @Bean TestSmartLifecycle testSmartLifecycle(){ return new TestSmartLifecycle(); } }
3.debugger啟動(dòng)應(yīng)用程序
可以看見(jiàn)如下的調(diào)用鏈,大致是SpringApplication.run(CommonsTestApplication.class, args)-->refreshContext-->refresh-->startBeans-->start,其中,再startBean中獲取了所有實(shí)現(xiàn)SmartLifecycle的非懶加載的bean,并再start方法中,調(diào)用對(duì)應(yīng)實(shí)現(xiàn)bean的start方法,執(zhí)行相應(yīng)的邏輯,具體可看下面截圖。
private void startBeans(boolean autoStartupOnly) { Map<String, Lifecycle> lifecycleBeans = getLifecycleBeans(); Map<Integer, LifecycleGroup> phases = new HashMap<>(); lifecycleBeans.forEach((beanName, bean) -> { if (!autoStartupOnly || (bean instanceof SmartLifecycle && ((SmartLifecycle) bean).isAutoStartup())) { int phase = getPhase(bean); LifecycleGroup group = phases.get(phase); if (group == null) { group = new LifecycleGroup(phase, this.timeoutPerShutdownPhase, lifecycleBeans, autoStartupOnly); phases.put(phase, group); } group.add(beanName, bean); } }); if (!phases.isEmpty()) { List<Integer> keys = new ArrayList<>(phases.keySet()); Collections.sort(keys); for (Integer key : keys) { phases.get(key).start(); } } }
到此這篇關(guān)于SpringBoot中SmartLifecycle的使用解析的文章就介紹到這了,更多相關(guān)SmartLifecycle的使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
超詳細(xì)講解SpringCloud?Commons公共抽象的用法
這篇文章主要介紹了超詳細(xì)講解SpringCloud?Commons公共抽象的用法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04java使用Runtime執(zhí)行系統(tǒng)命令遇到的問(wèn)題
這篇文章主要介紹了java使用Runtime執(zhí)行系統(tǒng)命令遇到的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-11-11Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法
這篇文章主要介紹了Java隨機(jī)生成手機(jī)短信驗(yàn)證碼的方法,涉及Java數(shù)學(xué)運(yùn)算計(jì)算隨機(jī)數(shù)及字符串操作的相關(guān)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-11-11ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟
本文主要介紹了ShardingSphere jdbc集成多數(shù)據(jù)源的實(shí)現(xiàn)步驟,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-10-10Java日常練習(xí)題,每天進(jìn)步一點(diǎn)點(diǎn)(39)
下面小編就為大家?guī)?lái)一篇Java基礎(chǔ)的幾道練習(xí)題(分享)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧,希望可以幫到你2021-07-07SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié)
本文主要介紹了SpringSecurity的TokenStore四種實(shí)現(xiàn)方式小結(jié),分別是InMemoryTokenStore,JdbcTokenStore,JwkTokenStore,RedisTokenStore,具有一定的參考價(jià)值,感興趣的可以了解一下2024-01-01淺談一下maven優(yōu)缺點(diǎn)及使用和特點(diǎn)
這篇文章主要介紹了淺談一下maven優(yōu)缺點(diǎn)及使用和特點(diǎn),一個(gè)項(xiàng)目管理工具軟件,那么maven項(xiàng)目有什么優(yōu)缺點(diǎn)呢,讓我們一起來(lái)看看吧2023-03-03