Spring中的SmartLifecycle作用

Spring中的SmartLifecycle作用

Spring SmartLifecycle 在容器所有bean加載和初始化完畢執(zhí)行

在使用Spring開發(fā)時,我們都知道,所有bean都交給Spring容器來統(tǒng)一管理,其中包括每一個bean的加載和初始化。
有時候我們需要在Spring加載和初始化所有bean后,接著執(zhí)行一些任務(wù)或者啟動需要的異步服務(wù),這樣我們可以使用 SmartLifecycle 來做到。

SmartLifecycle 是一個接口。當(dāng)Spring容器加載所有bean并完成初始化之后,會接著回調(diào)實現(xiàn)該接口的類中對應(yīng)的方法(start()方法)。


import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;

/**
 * SmartLifecycle測試
 *
 * 
 * 
 */
@Component
public class TestSmartLifecycle implements SmartLifecycle {

    private boolean isRunning = false;

    /**
     * 1. 我們主要在該方法中啟動任務(wù)或者其他異步服務(wù),比如開啟MQ接收消息<br/>
     * 2. 當(dāng)上下文被刷新(所有對象已被實例化和初始化之后)時,將調(diào)用該方法,默認(rèn)生命周期處理器將檢查每個SmartLifecycle對象的isAutoStartup()方法返回的布爾值。
     * 如果為“true”,則該方法會被調(diào)用,而不是等待顯式調(diào)用自己的start()方法。
     */
    @Override
    public void start() {
        System.out.println("start");

        // 執(zhí)行完其他業(yè)務(wù)后,可以修改 isRunning = true
        isRunning = true;
    }

    /**
     * 如果工程中有多個實現(xiàn)接口SmartLifecycle的類,則這些類的start的執(zhí)行順序按getPhase方法返回值從小到大執(zhí)行。<br/>
     * 例如:1比2先執(zhí)行,-1比0先執(zhí)行。 stop方法的執(zhí)行順序則相反,getPhase返回值較大類的stop方法先被調(diào)用,小的后被調(diào)用。
     */
    @Override
    public int getPhase() {
        // 默認(rèn)為0
        return 0;
    }

    /**
     * 根據(jù)該方法的返回值決定是否執(zhí)行start方法。<br/> 
     * 返回true時start方法會被自動執(zhí)行,返回false則不會。
     */
    @Override
    public boolean isAutoStartup() {
        // 默認(rèn)為false
        return true;
    }

    /**
     * 1. 只有該方法返回false時,start方法才會被執(zhí)行。<br/>
     * 2. 只有該方法返回true時,stop(Runnable callback)或stop()方法才會被執(zhí)行。
     */
    @Override
    public boolean isRunning() {
        // 默認(rèn)返回false
        return isRunning;
    }

    /**
     * SmartLifecycle子類的才有的方法,當(dāng)isRunning方法返回true時,該方法才會被調(diào)用。
     */
    @Override
    public void stop(Runnable callback) {
        System.out.println("stop(Runnable)");

        // 如果你讓isRunning返回true,需要執(zhí)行stop這個方法,那么就不要忘記調(diào)用callback.run()。
        // 否則在你程序退出時,Spring的DefaultLifecycleProcessor會認(rèn)為你這個TestSmartLifecycle沒有stop完成,程序會一直卡著結(jié)束不了,等待一定時間(默認(rèn)超時時間30秒)后才會自動結(jié)束。
        // PS:如果你想修改這個默認(rèn)超時時間,可以按下面思路做,當(dāng)然下面代碼是springmvc配置文件形式的參考,在SpringBoot中自然不是配置xml來完成,這里只是提供一種思路。
        // <bean id="lifecycleProcessor" class="org.springframework.context.support.DefaultLifecycleProcessor">
        //      <!-- timeout value in milliseconds -->
        //      <property name="timeoutPerShutdownPhase" value="10000"/>
        // </bean>
        callback.run();

        isRunning = false;
    }

    /**
     * 接口Lifecycle的子類的方法,只有非SmartLifecycle的子類才會執(zhí)行該方法。<br/>
     * 1. 該方法只對直接實現(xiàn)接口Lifecycle的類才起作用,對實現(xiàn)SmartLifecycle接口的類無效。<br/>
     * 2. 方法stop()和方法stop(Runnable callback)的區(qū)別只在于,后者是SmartLifecycle子類的專屬。
     */
    @Override
    public void stop() {
        System.out.println("stop");

        isRunning = false;
    }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,506評論 19 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 47,253評論 6 342
  • 什么是Spring Spring是一個開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,765評論 1 133
  • 文章作者:Tyan博客:noahsnail.com 3.4 Dependencies A typical ente...
    SnailTyan閱讀 4,476評論 2 7
  • 第一次,簽個到,留個紀(jì)念
    啦啦對閱讀 376評論 0 0

友情鏈接更多精彩內(nèi)容