当前位置: 首页 > article >正文

Spring Boot 项目启动后自动加载系统配置的多种实现方式

Spring Boot 项目启动后自动加载系统配置的多种实现方式

在 Spring Boot 项目中,可以通过以下几种方式实现 在项目启动完成后自动加载系统配置缓存操作 的需求:


1. 使用 CommandLineRunner

CommandLineRunner 是一个接口,可以用来在 Spring Boot 应用启动后立即执行一些逻辑代码。

实现方式:
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;

@Component
public class SystemConfigLoader implements CommandLineRunner {

    @Override
    public void run(String... args) throws Exception {
        // 在这里加载系统配置缓存
        System.out.println("项目启动完成,开始加载系统配置...");
        // 模拟加载配置操作
        loadSystemConfig();
    }

    private void loadSystemConfig() {
        // 假设从数据库中加载配置
        System.out.println("系统配置加载成功!");
    }
}

2. 使用 ApplicationRunner

ApplicationRunnerCommandLineRunner 类似,但支持接收一个 ApplicationArguments 对象,用于更灵活地处理传入参数。

实现方式:
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;

@Component
public class SystemConfigLoader implements ApplicationRunner {

    @Override
    public void run(ApplicationArguments args) throws Exception {
        // 在这里加载系统配置缓存
        System.out.println("项目启动完成,开始加载系统配置...");
        loadSystemConfig();
    }

    private void loadSystemConfig() {
        // 假设从数据库中加载配置
        System.out.println("系统配置加载成功!");
    }
}

3. 使用 @EventListener 监听 ApplicationReadyEvent

通过监听 ApplicationReadyEvent,可以在 Spring Boot 完成所有启动流程后执行逻辑。

实现方式:
import org.springframework.context.event.ContextRefreshedEvent;
import org.springframework.context.event.EventListener;
import org.springframework.stereotype.Component;

@Component
public class SystemConfigLoader {

    @EventListener(ApplicationReadyEvent.class)
    public void onApplicationReady() {
        // 在项目启动完成后加载系统配置
        System.out.println("项目启动完成,开始加载系统配置...");
        loadSystemConfig();
    }

    private void loadSystemConfig() {
        // 假设从数据库中加载配置
        System.out.println("系统配置加载成功!");
    }
}

4. 使用 @PostConstruct 注解

@PostConstruct 注解会在 Bean 初始化后执行,但其执行时机稍早于项目完全启动完成,因此需要配合延时操作来确保项目完全启动后再执行。

实现方式:
import jakarta.annotation.PostConstruct;
import org.springframework.stereotype.Component;

@Component
public class SystemConfigLoader {

    @PostConstruct
    public void init() {
        // 延时加载以确保项目完全启动
        new Thread(() -> {
            try {
                Thread.sleep(2000); // 模拟延时
                System.out.println("项目启动完成,开始加载系统配置...");
                loadSystemConfig();
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
            }
        }).start();
    }

    private void loadSystemConfig() {
        // 假设从数据库中加载配置
        System.out.println("系统配置加载成功!");
    }
}

5. 使用 SmartLifecycle 接口

SmartLifecycle 提供了更灵活的控制,可以控制代码的启动和停止时机。

实现方式:
import org.springframework.context.SmartLifecycle;
import org.springframework.stereotype.Component;

@Component
public class SystemConfigLoader implements SmartLifecycle {

    private boolean running = false;

    @Override
    public void start() {
        // 项目启动完成后执行逻辑
        System.out.println("项目启动完成,开始加载系统配置...");
        loadSystemConfig();
        running = true;
    }

    @Override
    public void stop() {
        // 停止逻辑(可选)
        System.out.println("项目停止时执行清理工作...");
    }

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

    private void loadSystemConfig() {
        // 模拟加载配置操作
        System.out.println("系统配置加载成功!");
    }
}

对比与推荐

  1. 简单场景:

    • 推荐使用 CommandLineRunnerApplicationRunner,实现简单且清晰。
  2. 更灵活的监听启动事件:

    • 推荐使用 @EventListener 监听 ApplicationReadyEvent,可以确保所有 Bean 初始化完成。
  3. 需要更细粒度的控制:

    • 使用 SmartLifecycle 提供更灵活的控制。

http://www.kler.cn/a/504028.html

相关文章:

  • C++实现设计模式---备忘录模式 (Memento)
  • SimpleFOC01|基于STM32F103+CubeMX,移植核心的common代码
  • stable diffusion 量化学习笔记
  • E10.【C语言】练习:编写一个猜数字游戏
  • ubuntu官方软件包网站 字体设置
  • 电力场景红外测温图像均压环下的避雷器识别分割数据集labelme格式2436张1类别
  • 202305 青少年软件编程等级考试C/C++ 二级真题答案及解析(电子学会)
  • 本地服务器Docker搭建个人云音乐平台Splayer并实现远程访问告别烦人广告
  • mapbox进阶,添加绘图控件
  • NHANES数据挖掘|特征变量对死亡率预测的研究设计与分析
  • 机器学习之自助法
  • 初识算法和数据结构P1:保姆级图文详解
  • 计算机网络八股文学习笔记
  • 基于网络爬虫技术的网络新闻分析【源码+文档+部署讲解】
  • Photoshop 滤镜使用详解(全集 ·  2025版)
  • 【计算机网络】lab7 TCP协议
  • 小结:路由器和交换机的指令对比
  • RabbitMQ介绍与使用
  • 【CSS】渐变光晕
  • 《使用深度生成学习预测无对比心脏电影 MRI 中急性心肌梗死的晚期钆增强》论文精度
  • 【网络协议】EIGRP - 第一部分
  • Qt 自动根据编译的dll或exe 将相关dll文件复制到目标文件夹
  • MC1.12.2 macOS高清修复OptiFine运行崩溃
  • Termora 一个开源的 SSH 跨平台客户端工具
  • JAVA多线程学习
  • TCP/UDP/IP报文大小