亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

SpringBoot啟動后自動執(zhí)行初始化任務的五種方法

 更新時間:2025年04月10日 09:44:12   作者:浪浪山老周  
在 Spring Boot 開發(fā)中,我們經(jīng)常需要在應用啟動后立即執(zhí)行初始化任務,本文將深度解析 ??5 種主流實現(xiàn)方案??,大家可以根據(jù)自己的需求自行選擇

導語??

在 Spring Boot 開發(fā)中,我們經(jīng)常需要在應用啟動后立即執(zhí)行初始化任務(如加載配置、預熱緩存、啟動定時任務)。本文將深度解析 ??5 種主流實現(xiàn)方案??,包含完整代碼示例、執(zhí)行順序控制技巧和避坑指南!

一、為什么需要啟動后自動執(zhí)行方法

典型使用場景

場景類型具體案例技術價值
數(shù)據(jù)初始化 ??加載字典數(shù)據(jù)到內(nèi)存提升接口響應速度
定時任務啟動 ??啟動分布式任務調(diào)度確保任務在服務就緒后執(zhí)行
?? 資源預加載??預熱 Redis 緩存避免冷啟動導致的性能波動
?? 參數(shù)校驗??檢查必要配置項是否存在增強系統(tǒng)健壯性
?? 第三方服務注冊??向服務注冊中心注冊實例保障微服務可用性

二、六大實現(xiàn)方案全解析

方案 1:@PostConstruct(簡單初始化)

@Service
public class CacheInitializer {
    
    @PostConstruct
    public void init() {
        // 在 Bean 初始化完成后執(zhí)行
        loadAllConfigToCache();
        System.out.println("字典數(shù)據(jù)加載完成");
    }
}

??特點??:

  • 執(zhí)行時機:依賴注入完成后立即執(zhí)行
  • 適用場景:單 Bean 的簡單初始化
  • 注意:無法處理跨 Bean 依賴

方案 2:ApplicationRunner(參數(shù)解析增強)

java
@Component
@Order(1) // 控制執(zhí)行順序
public class StartupRunner implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) {
        // 解析命令行參數(shù)
        boolean force = args.containsOption("force");
        String configFile = args.getOptionValues("config").get(0);
        
        // 執(zhí)行初始化邏輯
        System.out.println("使用參數(shù)啟動:force="+force+", configFile="+configFile);
    }
}

??優(yōu)勢??:

  • 支持命令行參數(shù)解析
  • 天然支持 @Order 排序

方案 3:ApplicationListener

@Component
public class ApplicationReadyListener {
    
    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        // 確保所有 Bean 初始化完成
        System.out.println("所有組件就緒,執(zhí)行最終初始化");
    }
}

??特殊價值??:

  • 可監(jiān)聽多個應用事件(如 ApplicationStartingEvent)
  • 適合需要延遲執(zhí)行的場景

方案 4:CommandLineRunner(基礎參數(shù)處理)

@Component
public class ConfigLoader implements CommandLineRunner {
    
    @Override
    public void run(String... args) {
        // 處理原始命令行參數(shù)
        System.out.println("原始參數(shù):"+Arrays.toString(args));
    }
}

適用場景??: 僅需處理字符串參數(shù)的場景

方案 5:自定義監(jiān)聽器(復雜流程控制)

@Component
public class StartupListener implements ApplicationListener<ContextRefreshedEvent> {
    
    @Override
    public void onApplicationEvent(ContextRefreshedEvent event) {
        if (event.getApplicationContext().getParent() == null) {
            // 只在根上下文初始化時執(zhí)行
            System.out.println("根上下文初始化完成");
        }
    }
}

高級用法??:

  • 防止多次觸發(fā)(通過上下文判斷)
  • 結(jié)合 @Async 實現(xiàn)異步初始化

方案 6:@Scheduled 定時啟動(延遲執(zhí)行)

@Component
@EnableScheduling
public class DelayedInitializer {
    
    @Scheduled(fixedDelay = 5000) // 首次延遲5秒后執(zhí)行
    public void delayedInit() {
        System.out.println("延遲初始化任務執(zhí)行");
    }
}

??特殊場景??: 需要延遲執(zhí)行的初始化任務

三、方案對比決策矩陣

方案執(zhí)行時機參數(shù)支持執(zhí)行順序適用復雜度
@PostConstructBean初始化后
ApplicationRunner應用啟動完成解析參數(shù)支持★★★☆☆
ApplicationListener應用事件觸發(fā)需手動★★★★☆
@Scheduled定時觸發(fā)★★☆☆☆

四、完整落地流程

步驟 1:創(chuàng)建初始化 Service

@Service
public class StartupService {
    
    public void initConfig() {
        // 加載配置邏輯
    }
    
    public void warmUpCache() {
        // 緩存預熱邏輯
    }
}

步驟 2:選擇執(zhí)行方案(以 ApplicationRunner 為例)

@Component
@Order(1)
public class StartupRunner implements ApplicationRunner {
    
    private final StartupService startupService;
    
    public StartupRunner(StartupService startupService) {
        this.startupService = startupService;
    }

    @Override
    public void run(ApplicationArguments args) {
        startupService.initConfig();
        startupService.warmUpCache();
    }
}

步驟 3:配置執(zhí)行順序(多初始化任務時)

@Component
@Order(2)
public class SecondaryInitializer implements CommandLineRunner {
    // 次級初始化任務
}

五、避坑指南與最佳實踐

1. 循環(huán)依賴陷阱

// 錯誤示例:A 依賴 B,B 依賴 A
@Service
public class AService {
    private final BService bService;
    
    public AService(BService bService) {
        this.bService = bService;
    }
    
    @PostConstruct
    public void init() {
        bService.doSomething(); // 觸發(fā)循環(huán)依賴
    }
}

解決方案??: 使用 @Lazy 延遲加載

2. 異步執(zhí)行配置

@EnableAsync
@Configuration
public class AsyncConfig {
    
    @Bean
    public Executor taskExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        executor.setCorePoolSize(5);
        executor.setQueueCapacity(100);
        return executor;
    }
}

???????// 在方法上添加異步執(zhí)行
@Async
public void asyncInit() {
    // 異步初始化邏輯
}

3. 執(zhí)行順序控制

@Component
@Order(1) // 數(shù)字越小優(yōu)先級越高
public class FirstInitializer implements ApplicationRunner {}

@Component
@Order(2)
public class SecondInitializer implements ApplicationRunner {}

六、生產(chǎn)環(huán)境驗證方案

1. 單元測試

@SpringBootTest
class StartupTest {
    
    @Autowired
    private StartupService startupService;
    
    @Test
    void testInitSequence() {
        // 驗證初始化順序
        verifyOrder(startupService::initConfig, startupService::warmUpCache);
    }
}

2. 日志監(jiān)控

2025-04-09 09:00:00.000  INFO 12345 --- [           main] c.e.demo.StartupRunner                 : === 應用啟動初始化開始 ===
2025-04-09 09:00:00.100  INFO 12345 --- [           main] c.e.demo.CacheInitializer              : 字典數(shù)據(jù)加載完成(耗時85ms)
2025-04-09 09:00:00.200  INFO 12345 --- [           main] c.e.demo.StartupRunner                 : === 所有初始化任務完成 ===

七、擴展場景方案

1. 分布式鎖控制(防重復執(zhí)行)

@PostConstruct
public void distributedInit() {
    RLock lock = redissonClient.getLock("startup:init");
    if (lock.tryLock(0, 60, TimeUnit.SECONDS)) {
        try {
            // 執(zhí)行初始化
        } finally {
            lock.unlock();
        }
    }
}

2. 健康檢查聯(lián)動

@EventListener(ApplicationReadyEvent.class)
public void healthCheck() {
    HealthIndicator indicator = context.getBean(HealthIndicator.class);
    if (!indicator.health().getStatus().equals(Status.UP)) {
        throw new RuntimeException("依賴服務未就緒");
    }
}

八、總結(jié)與選擇建議

需求場景推薦方案
簡單初始化@PostConstruct
需要參數(shù)處理ApplicationRunner
需要監(jiān)聽應用狀態(tài)ApplicationListener
延遲執(zhí)行@Scheduled
復雜初始化流程自定義監(jiān)聽器 + 異步執(zhí)行

以上就是SpringBoot啟動后自動執(zhí)行初始化任務的五種方法的詳細內(nèi)容,更多關于SpringBoot啟動后初始化的資料請關注腳本之家其它相關文章!

相關文章

  • Java日志框架之logback使用詳解

    Java日志框架之logback使用詳解

    這篇文章主要介紹了Java日志框架之logback使用詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • SpringBoot使用Redisson實現(xiàn)延遲執(zhí)行的完整示例

    SpringBoot使用Redisson實現(xiàn)延遲執(zhí)行的完整示例

    這篇文章主要介紹了SpringBoot使用Redisson實現(xiàn)延遲執(zhí)行的完整示例,文中通過代碼示例講解的非常詳細,對大家的學習或工作有一定的幫助,需要的朋友可以參考下
    2024-06-06
  • 使用Spring-Retry解決Spring Boot應用程序中的重試問題

    使用Spring-Retry解決Spring Boot應用程序中的重試問題

    重試的使用場景比較多,比如調(diào)用遠程服務時,由于網(wǎng)絡或者服務端響應慢導致調(diào)用超時,此時可以多重試幾次。用定時任務也可以實現(xiàn)重試的效果,但比較麻煩,用Spring Retry的話一個注解搞定所有,感興趣的可以了解一下
    2023-04-04
  • Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法

    Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法

    這篇文章主要介紹了Java窗體動態(tài)加載磁盤文件的實現(xiàn)方法,需要的朋友可以參考下
    2014-03-03
  • 基于swing開發(fā)彈幕播放器

    基于swing開發(fā)彈幕播放器

    這篇文章主要為大家詳細介紹了基于swing實現(xiàn)彈幕播放器的開發(fā)過程,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • Java調(diào)用Pytorch模型實現(xiàn)圖像識別

    Java調(diào)用Pytorch模型實現(xiàn)圖像識別

    這篇文章主要為大家詳細介紹了Java如何調(diào)用Pytorch實現(xiàn)圖像識別功能,文中的示例代碼講解詳細,具有一定的學習價值,感興趣的小伙伴可以了解一下
    2023-06-06
  • 詳解Java構建樹結(jié)構的公共方法

    詳解Java構建樹結(jié)構的公共方法

    本文主要介紹了詳解Java構建樹結(jié)構的公共方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-04-04
  • springboot2.5.2與 flowable6.6.0整合流程引擎應用分析

    springboot2.5.2與 flowable6.6.0整合流程引擎應用分析

    這篇文章主要介紹了springboot2.5.2與 flowable6.6.0整合流程引擎應用分析,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-07-07
  • Java使用JSON實現(xiàn)處理中文亂碼和Date格式

    Java使用JSON實現(xiàn)處理中文亂碼和Date格式

    這篇文章主要為大家詳細介紹了Java如何在項目中使用JSON實現(xiàn)處理中文亂碼和Date格式的功能,文中的示例代碼講解詳細,需要的小伙伴可以參考一下
    2023-06-06
  • Java 替換word文檔文字并指定位置插入圖片

    Java 替換word文檔文字并指定位置插入圖片

    這篇文章主要介紹了Java 替換word文檔文字,指定位置插入圖片功能,本文通過實例代碼給大家講解,需要的朋友可以參考下
    2018-02-02

最新評論