
有些場景我們需要在Spring 所有的bean 完成初始化后緊接著執行一些任務或者啟動需要的異步服務。 常見有幾種解決方案
- j2ee 注解 啟動前@PostConstruct 銷毀前@PreDestroy 基于j2ee 規范
- springboot 的 org.springframework.boot.CommandLineRunner springboot 特性前面我已經介紹過了
- spring org.springframework.context.SmartLifecycle
這里介紹一下第三種 SmartLifecycle
SmartLifecycle 不僅僅能在初始化后執行一個邏輯,還能再關閉前執行一個邏輯,比如你一個服務在啟動時向服務注冊發現中心發一個信號告訴它服務上線了,下線前通知它你下線了。也就是實現了一個 從生到死 的輪回。
話不多說先實現一個SmartLifeCycle

我們發現實現類需要實現3個方法,但是這3個方法并不是SmartLifecycle的方法而是
org.springframework.context.Lifecycle
的方法:
- void start() 我們主要在該方法中啟動任務或者其他異步服務,比如開啟MQ接收消息當上下文被刷新(所有對象已被實例化和初始化之后)時,將調用該方法,默認生命周期 處理器將檢查每個SmartLifecycle對象的isAutoStartup()方法返回的布爾值。如果為“true”,則該方法會被調用,而不是等待顯式調用自己的start()方法,同時當上下文被刷新(所有對象已被實例化和初始化之后)時,將調用該方法,默認生命周期處理器將檢查每個SmartLifecycle對象的isAutoStartup()方法返回的布爾值, 如果為true,則該方法會被調用,而不是等待顯式調用自己的start()方法,boolean isRunning() 的狀態信號也決定此方法是否執行只有當該方法返回false start()方法才會被執行,有興趣可以看LifecycleProcessor相關實現
- void stop() 顧名思義 生命周期結束時調用的方法。只有當 boolean isRunning() 方法返回true 該方法才會被執行,該方法是屬于Lifecyle接口的,被SmartLifeCycle作為了一個鉤子。 實際執行的是SmartLifeCycle中的這個方法

- boolean isRunning() 作為 信號來判定 start 還是stop
我們來啟動一下springboot應用測試一下,下圖說明 start在應用啟動前執行了

然后我們寫一個springmvc 接口來關閉應用,下面的關閉方法寫的比較粗糙,當然有更高級的玩法。

我們調用 /life/destroy 方法 ,會出現下面的結果

這里介紹它的一些使用方法和場景,先學會使用,更深層次的留給你自己去挖掘。
我是碼農小胖哥,關注我的頭條或者公眾號,天天有干貨。有問題可以留言或者私信,覺得寫的不錯可以點個贊,轉發一下。
