最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring SmartLifecycle:如何精準(zhǔn)控制Bean的生命周期

 更新時間:2025年03月26日 11:02:03   作者:catoop  
這篇文章主要介紹了Spring SmartLifecycle:如何精準(zhǔn)控制Bean的生命周期問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

一、核心作用

SmartLifecycle 是 Spring 框架中用于 精確控制組件生命周期階段 的高級接口,主要解決三類問題:

  1. 有序啟停:控制多個組件啟動/關(guān)閉順序
  2. 階段化處理:將初始化/銷毀操作劃分為不同階段
  3. 上下文感知:獲取應(yīng)用上下文狀態(tài)變化事件

二、典型應(yīng)用場景

場景具體用途優(yōu)勢體現(xiàn)
連接池管理數(shù)據(jù)庫/Redis連接池的預(yù)熱和優(yōu)雅關(guān)閉避免連接泄漏
線程池控制異步線程池的初始化與任務(wù)排空防止任務(wù)丟失
外部服務(wù)注冊服務(wù)注冊中心的上線通知與下線注銷保證服務(wù)狀態(tài)一致性
定時任務(wù)調(diào)度分布式任務(wù)調(diào)度器的啟動與暫停精準(zhǔn)控制任務(wù)執(zhí)行周期
硬件設(shè)備控制IoT設(shè)備連接初始化與安全斷開保障設(shè)備操作安全性

三、核心方法詳解

public interface SmartLifecycle extends Lifecycle {
    
    // 關(guān)鍵方法1:啟動組件(自動觸發(fā))
    void start();
    
    // 關(guān)鍵方法2:停止組件(帶異步通知)
    default void stop(Runnable callback) {
        stop();
        callback.run();
    }
    
    // 關(guān)鍵方法3:相位控制(數(shù)值越小優(yōu)先級越高)
    int getPhase();
    
    // 其他方法
    boolean isAutoStartup();
    boolean isRunning();
}

四、實戰(zhàn)代碼示例

基本案例:

@Component
public class DatabaseConnector implements SmartLifecycle {
    private volatile boolean running = false;
    private ConnectionPool pool;

    @Override
    public void start() {
        if (!running) {
            this.pool = initConnectionPool(); // 連接池預(yù)熱
            running = true;
        }
    }

    @Override
    public void stop() {
        if (running) {
            pool.safeRelease(); // 安全釋放連接
            running = false;
        }
    }

    @Override
    public int getPhase() {
        return Integer.MIN_VALUE + 1000; // 高優(yōu)先級組件
    }
}

主動結(jié)束當(dāng)前線程的處理案例:

@Slf4j
@Configuration
public class SensitiveWordsConfiguration implements SmartLifecycle {

    /**
     * lifeRunning
     */
    private volatile boolean lifeRunning = false;
    
    /**
     * 更新時間間隔
     */
    private static final long UPDATE_TIME_SECONDS = 10 * 60;
    
    /**
     * 是否終止線程
     */
    private volatile boolean threadStop = false;
    /**
     * taskExecutor
     */
    @Autowired
    private ThreadPoolTaskExecutor taskExecutor;
    /**
     * 當(dāng)前線程任務(wù)
     */
    private Future<?> future;
    
    /**
     * 實現(xiàn)熱更新,修改詞典后自動加載
     */
    private void startScheduledUpdate() {
        while (!threadStop && !Thread.currentThread().isInterrupted()) {
            try {
                log.debug("SensitiveWordConfig#startScheduledUpdate start update...");
                
                //這里做業(yè)務(wù)處理
                //...
                
                TimeUnit.SECONDS.sleep(UPDATE_TIME_SECONDS);
            } catch (InterruptedException e) {
                log.info("SensitiveWordConfig#startScheduledUpdate interrupted: {}", e.getMessage());
                Thread.currentThread().interrupt();
                break;
            }
        }
    }

    @Override
    public void start() {
        // 啟動定時更新任務(wù)線程
        this.future = taskExecutor.submit(this::startScheduledUpdate);
        lifeRunning = true;
    }

    @Override
    public void stop() {
        threadStop = true;
        // 主動終止當(dāng)前線程的(否則會持續(xù)sleep直到線程池shutdownNow導(dǎo)致占用停止時間)
        this.future.cancel(true);
        lifeRunning = false;
    }

    @Override
    public boolean isRunning() {
        return lifeRunning;
    }

}

要特別注意的是:這個案例中使用了spring上下文中的 ThreadPoolTaskExecutor,所以不能使用 @PreDestroy 注解方法來進(jìn)行回收處理,因為spring在關(guān)閉容器時會先對上下問中的線程池進(jìn)行shutdown完成后,才會執(zhí)行所有bean的destroy方法。

五、相位控制策略

通過 getPhase() 返回值控制執(zhí)行順序:

  • 啟動順序:相位值 從小到大 執(zhí)行
  • 關(guān)閉順序:相位值 從大到小 執(zhí)行

六、與普通Lifecycle的區(qū)別

特性LifecycleSmartLifecycle
自動啟動? 需手動觸發(fā)? 支持自動啟動
停止回調(diào)? 無? 帶異步完成通知
執(zhí)行順序控制? 不支持? 相位值精確控制
上下文刷新集成? 有限支持? 深度集成上下文生命周期

七、注意事項

  1. 異常處理:在start()/stop()中必須捕獲異常,避免阻斷全局生命周期流程
  2. 線程安全:確保實現(xiàn)類方法的線程安全性
  3. 性能影響:避免在生命周期方法中執(zhí)行耗時操作(>1秒的操作建議異步化)
  4. 容器兼容:與@PostConstruct/@PreDestroy注解配合使用時注意執(zhí)行順序。執(zhí)行順序 @PostConstruct > start() > stop() > @PreDestroy

通過合理使用 SmartLifecycle,可以實現(xiàn) 服務(wù)零中斷重啟、資源按序回收 等高級功能,是構(gòu)建企業(yè)級 Spring 應(yīng)用的必備技能。

總結(jié)

以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • java:程序包com.xxx.xxx不存在報錯萬能解決辦法

    java:程序包com.xxx.xxx不存在報錯萬能解決辦法

    這篇文章主要給大家介紹了關(guān)于java:程序包com.xxx.xxx不存在報錯萬能解決辦法,這個問題曾逼瘋初學(xué)者的我,不過弄清楚原理后就很簡單了,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-12-12
  • Java多線程ForkJoinPool實例詳解

    Java多線程ForkJoinPool實例詳解

    這篇文章主要介紹了Java多線程ForkJoinPool實例詳解,涉及forkjoin框架的相關(guān)內(nèi)容,需要的朋友可以參考下。
    2017-09-09
  • APT?注解處理器實現(xiàn)?Lombok?常用注解功能詳解

    APT?注解處理器實現(xiàn)?Lombok?常用注解功能詳解

    這篇文章主要為大家介紹了使用APT?注解處理器實現(xiàn)?Lombok?常用注解功能詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-09-09
  • SpringBoot集成tomcat詳解實現(xiàn)過程

    SpringBoot集成tomcat詳解實現(xiàn)過程

    采用spring boot之后,一切變得如此簡單,打包->java-jar->運維,只需要一個jar包便可以隨意部署安裝。這篇文章,將對 spring boot集成tomcat的源碼進(jìn)行分析,探索其內(nèi)部的原理
    2023-02-02
  • java實現(xiàn)液晶數(shù)字字體顯示當(dāng)前時間

    java實現(xiàn)液晶數(shù)字字體顯示當(dāng)前時間

    這篇文章主要為大家詳細(xì)介紹了java實現(xiàn)液晶數(shù)字字體顯示當(dāng)前時間,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-12-12
  • java泛型基本知識和通用方法

    java泛型基本知識和通用方法

    這篇文章主要介紹了java泛型基礎(chǔ)知識及通用方法,從以下幾個方面介紹一下java的泛型: 基礎(chǔ), 泛型關(guān)鍵字, 泛型方法, 泛型類和接口,感興趣的可以了解一下
    2021-06-06
  • jedis的testWhileIdle用法源碼解讀

    jedis的testWhileIdle用法源碼解讀

    這篇文章主要為大家介紹了jedis的testWhileIdle用法源碼解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • SpringBoot公共頁面抽取方法實現(xiàn)過程介紹

    SpringBoot公共頁面抽取方法實現(xiàn)過程介紹

    這篇文章主要介紹了SpringBoot抽取公共頁面的方法實現(xiàn)過程,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)吧
    2022-10-10
  • JAVA深入探究之Method的Invoke方法

    JAVA深入探究之Method的Invoke方法

    這篇文章主要給大家介紹了關(guān)于JAVA深入探究之Method的Invoke方法的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • Idea中使用Git實現(xiàn)方式

    Idea中使用Git實現(xiàn)方式

    本文總結(jié)了在Idea中配置Git、創(chuàng)建遠(yuǎn)程倉庫、弱化了暫存區(qū)等內(nèi)容,詳細(xì)介紹了復(fù)制倉庫鏈接、創(chuàng)建本地倉庫、提交、查看提交記錄、推送、克隆、創(chuàng)建分支、切換、刪除、創(chuàng)建、重命名分支等操作
    2026-05-05

最新評論

富平县| 天台县| 太和县| 都安| 金秀| 宜城市| 庆云县| 安义县| 平罗县| 微山县| 淅川县| 肥城市| 九寨沟县| 周至县| 和静县| 邯郸县| 新丰县| 眉山市| 丰都县| 凉山| 宣化县| 西和县| 新沂市| 方城县| 娄烦县| 深泽县| 德惠市| 弥渡县| 桂阳县| 新干县| 延长县| 河北区| 东平县| 安顺市| 清丰县| 交城县| 扶风县| 威宁| 孝义市| 宁强县| 漠河县|