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

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 {@Overridepublic 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 {@Overridepublic 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 {@PostConstructpublic 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;@Overridepublic void start() {// 项目启动完成后执行逻辑System.out.println("项目启动完成,开始加载系统配置...");loadSystemConfig();running = true;}@Overridepublic void stop() {// 停止逻辑(可选)System.out.println("项目停止时执行清理工作...");}@Overridepublic boolean isRunning() {return running;}private void loadSystemConfig() {// 模拟加载配置操作System.out.println("系统配置加载成功!");}
}

对比与推荐

  1. 简单场景:

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

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

    • 使用 SmartLifecycle 提供更灵活的控制。
http://www.lryc.cn/news/521334.html

相关文章:

  • 如何在 CentOS 中生成 CSR
  • qml XmlListModel详解
  • C++并发编程之跨应用程序与驱动程序的单生产者单消费者队列
  • PostgreSQL技术内幕22:vacuum full 和 vacuum
  • 【网络】:网络编程套接字
  • java基础概念55-不可变集合
  • 深入理解 C++ 函数重载
  • 相机和激光雷达的外参标定 - 无标定板版本
  • Redis 知识速览
  • LeetCode 热题 100_从前序与中序遍历序列构造二叉树(47_105_中等_C++)(二叉树;递归)
  • 使用sqlplus的easy connect时如何指定是链接到shared server还是dedicated process
  • ubuntu22.4 ROS2 安装gazebo(环境变量配置)
  • 【机器学习:十四、TensorFlow与PyTorch的对比分析】
  • [C++]类与对象(上)
  • 大数据技术实训:Zookeeper集群配置
  • HTML5 加载动画(Loading Animation)
  • C语言进阶-2指针(一)
  • 【人工智能】用Python进行对象检测:从OpenCV到YOLO的全面指南
  • 《深度剖析算法优化:提升效率与精度的秘诀》
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引工作原理,索引失效,索引创建原则等)
  • matlab使用 BP 神经网络进行数据预测的完整流程,包括数据读取、数据预处理等等
  • systemd-networkd NetworkManager 介绍
  • 本地部署项目管理工具 Leantime 并实现外部访问
  • PHP cURL 函数初学者完全指南
  • C#中的Array数组,List集合和ArrayList集合--07
  • 基于深度学习的视觉检测小项目(十三) 资源文件的生成和调用
  • 硬件实用技巧:TPS54331DR横杠标识识别1引脚
  • 《C++11》nullptr介绍:从NULL说起
  • 自然语言处理基础:全面概述
  • 网络安全的几种攻击方法