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

news2025/1/16 3:56:36

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.coloradmin.cn/o/2277329.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ffmpeg硬件编码

使用FFmpeg进行硬件编码可以显著提高视频编码的性能,尤其是在处理高分辨率视频时。硬件编码利用GPU或其他专用硬件(如Intel QSV、NVIDIA NVENC、AMD AMF等)来加速编码过程。以下是使用FFmpeg进行硬件编码的详细说明和示例代码。 1. 硬件编码支…

【高可用自动化体系】自动化体系

架构设计的愿景就是高可用、高性能、高扩展、高效率。为了实现架构设计四高愿景,需要实现自动化系统目标: 标准化。 流程自助化。 可视化:可观测系统各项指标、包括全链路跟踪。 自动化:ci/cd 自动化部署。 精细化&#xff1a…

elasticsearch中IK分词器

1、什么是IK分词器 ElasticSearch 几种常用分词器如下: 分词器分词方式StandardAnalyzer单字分词CJKAnalyzer二分法IKAnalyzer词库分词 分词∶即把一段中文或者别的划分成一个个的关键字,我们在搜索时候会把自己的信息进行分词,会把数据库…

arcgis中生成格网矢量带高度

效果 1、数据准备 (1)矢量边界(miain.shp) (2)DEM(用于提取格网标高) (3)DSM(用于提取格网最高点) 2、根据矢量范围生成格网 模板范围选择矢量边界,像元宽度和高度根据坐标系来输入,我这边是4326的,所以输入的是弧度,输出格网矢量gewang.shp 3、分区统计 …

一文了解如何使用 DBeaver 管理 DolphinDB

在日常的数据开发、分析和数据库运维中,一款优秀的 IDE 能够极大地提升工作效率。DBEaver 是一款由 Java 编写的一站式跨平台连接器,其社区版本已能支持连接近百种数据库,受到广大开发者的喜爱。近期。DolphinDB 与 DBeaver 团队共同努力&…

【ArcGIS微课1000例】0138:ArcGIS栅格数据每个像元值转为Excel文本进行统计分析、做图表

本文讲述在ArcGIS中,以globeland30数据为例,将栅格数据每个像元值转为Excel文本,便于在Excel中进行统计分析。 文章目录 一、加载globeland30数据二、栅格转点三、像元值提取至点四、Excel打开一、加载globeland30数据 打开配套实验数据包中的0138.rar中的tif格式栅格土地覆…

JVM之垃圾回收器ZGC概述以及垃圾回收器总结的详细解析

ZGC ZGC 收集器是一个可伸缩的、低延迟的垃圾收集器,基于 Region 内存布局的,不设分代,使用了读屏障、染色指针和内存多重映射等技术来实现可并发的标记压缩算法 在 CMS 和 G1 中都用到了写屏障,而 ZGC 用到了读屏障 染色指针&a…

C# XPTable 日期字段处理(XPTable控件使用说明十三)

1、SQLite数据库定义为日期类型 2、XPtable中日期字段定义与显示 //显示时间表columnModel1.Columns.Clear();columnModel1.Columns.Add(new NumberColumn("id", 30));NumberColumn numberColumn new NumberColumn("次数", 50);numberColumn.Maximum 100…

【pycharm发现找不到python打包工具,且无法下载】

发现找不到python打包工具,且无法下载 解决方法: 第一步:安装distutils,在CMD命令行输入: python -m ensurepip --default-pip第二步:检查和安装setuptools和wheel: python -m pip install --upgrade …

晨辉面试抽签和评分管理系统之六:面试答题倒计时

晨辉面试抽签和评分管理系统(下载地址:www.chenhuisoft.cn)是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

王炸组合:Dolphinscheudler 3.1.*搭配SeaT unnel2.3.*高效完成异构数据数据集成

概述 本篇主要介绍如何通过Dolphinscheduler海豚调度搭配Seatunnel完成异构数据源之间的数据同步功能,这个在大数据流批一体数仓建设的过程中是一个非常好的解决方案, 稳定高效,只要用上了你肯定爱不释手。 环境准备 dolphinscheduler集群…

【AI日记】25.01.11 Weights Biases | AI 笔记 notion

【AI论文解读】【AI知识点】【AI小项目】【AI战略思考】【AI日记】【读书与思考】 AI kaggle 比赛:Forecasting Sticker Sales笔记:我的 AI 笔记主要记在两个地方 有道云笔记:数学公式和符号比较多的笔记notion:没什么数学公式的…

Oracle EBS GL定期盘存WIP日记账无法过账数据修复

系统环境 RDBMS : 12.1.0.2.0 Oracle Applications : 12.2.6 问题症状 用户反映来源为“定期盘存”和类别为“WIP”的日记账无法过账,标准日记账的界面上的过账按钮灰色不可用。但是,在超级用户职责下,该日记账又可以过账,细心检查发现该业务实体下有二个公司段值15100和…

欧拉路径算法

欧拉图: 对于应该连通图G,有: 1欧拉路径:一条路径,它能够不重复地遍历完所有的边,这个性质很像不重复地一笔画完所有边,所以有些涉及到欧拉路径的问题叫做一笔画问题。 2欧拉回路&#xff1a…

【进程与线程】程序和进程在内存中的表现

在计算机系统中,程序和进程是两个密切相关但又有本质区别的概念,尤其在内存中的表现上有显著不同: 在这张图中可以直观地看出程序和进程在内存中的结构区别。 基本定义 程序 程序 是一个 静态实体,表示一组写好的指令和数据的…

“多维像素”多模态雷视融合技术构建自动驾驶超级感知能力|上海昱感微电子创始人蒋宏GADS演讲预告

2025年1月14日,第四届全球自动驾驶峰会将在北京中关村国家自主创新示范区展示交易中心-会议中心举行。经过三年的发展,全球自动驾驶峰会已经成长为国内自动驾驶领域最具影响力、规模最大的产业峰会之一。昱感微电子创始人&CEO受到主办方邀请&#xf…

Linux创建server服务器实现多方信息收发

一,服务端 1.创建socket套接字,用于网络通信,同一台机器上的进程也可以通过本地套接字进行通信 //1.socket s_fd socket(AF_INET,SOCK_STREAM,0); if(s_fd -1){ perror("socket"); exit(-1); } //server address s_addr.sin_fami…

UML系列之Rational Rose笔记七:状态图

一、新建状态图 依旧是新建statechart diagram; 二、工作台介绍 接着就是一个状态的开始:开始黑点依旧可以从左边进行拖动放置: 这就是状态的开始,和活动图泳道图是一样的;只能有一个开始,但是可以有多个…

jsx语法中el-table-v2中cellRender如何使用动态绑定

答案::attribute"xx"改为attribute{xx} 改写: const columns ref([{ key: index, dataKey: index, title: t(setting.index), width: 100 },{ key: no, dataKey: no, title: t(setting.key), width: 100 },{ key: name, dataKey: name, tit…

【初识扫盲】厚尾分布

厚尾分布(Fat-tailed distribution)是一种概率分布,其尾部比正态分布更“厚”,即尾部的概率密度更大,极端值出现的概率更高。 一、厚尾分布的特征 尾部概率大 在正态分布中,极端值(如距离均值很…