SpringBoot支持动态更新配置文件参数

前言
博主介绍:✌目前全网粉丝3W+,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。
涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。
博主所有博客文件目录索引:博客目录索引(持续更新)
视频平台:b站-Coder长路
章节描述
在springboot服务启动之后,想要通过接口来动态修改配置文件参数,实现动态参数配置信息获取。
gitee:https://gitee.com/changluJava/demo-exer/tree/master/SpringBoot/springboot-config/src/main/java/com/changlu/springbootconfig
github:https://github.com/changluya/Java-Demos/tree/master/SpringBoot/springboot-config/src/main/java/com/changlu/springbootconfig
实现接口动态刷新配置参数

代码实现
1、DynamicPropertyUpdater(动态配置项更新器)
自定义DynamicPropertySource动态配置类,接着本质通过environment.getPropertySources()来获取到配置项属性器,后续更新配置项去构造DynamicPropertySource添加到属性器即可完成属性配置覆盖。
package com.changlu.springbootconfig.config;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import org.springframework.stereotype.Component;import java.util.Map;@Component
public class DynamicPropertyUpdater {private static final Logger logger = LoggerFactory.getLogger(DynamicPropertyUpdater.class);private final ConfigurableEnvironment environment;public DynamicPropertyUpdater(ConfigurableEnvironment environment) {this.environment = environment;}/*** 动态更新 Environment 中的配置项值** @param key 配置项的键* @param value 配置项的新值*/public void updateProperty(String key, String value) {logger.info("Updating property: {} = {}", key, value);MutablePropertySources propertySources = environment.getPropertySources();// 添加或更新属性propertySources.addFirst(new DynamicPropertySource(key, value));}/*** 批量动态更新 Environment 中的配置项值* @param properties 配置项*/public void updateProperties(Map<String, String> properties) {for (Map.Entry<String, String> entry : properties.entrySet()) {// 复用单独更新配置项逻辑this.updateProperty(entry.getKey(), entry.getValue());}}/*** 自定义动态属性源*/private static class DynamicPropertySource extends PropertySource<String> {private final String key;private final String value;public DynamicPropertySource(String key, String value) {super("dynamicPropertySource"); // 属性源的名称this.key = key;this.value = value;}@Overridepublic Object getProperty(String name) {// 如果传入的 key 匹配,则返回对应的 valueif (key.equals(name)) {return value;}return null; // 如果不匹配,返回 null}}
}
2、EnvironmentContext(environment管理器)
package com.changlu.springbootconfig.config;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;@Component
public class EnvironmentContext {@Autowiredprivate Environment environment;public String getProperty(String key, String defaultVal) {return environment.getProperty(key, defaultVal);}
}
3、ConfigController 实现查询配置、更新配置接口

import com.changlu.springbootconfig.config.DynamicPropertyUpdater;
import com.changlu.springbootconfig.config.EnvironmentContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/config")
public class ConfigController {@Autowiredprivate DynamicPropertyUpdater dynamicPropertyUpdater;@Autowiredprivate EnvironmentContext environmentContext;/*** 动态更新配置项的值** @param key 配置项的键* @param value 配置项的新值* @return 更新结果*/@PostMapping("/update")public String updateConfig(@RequestParam String key, @RequestParam String value) {dynamicPropertyUpdater.updateProperty(key, value);return "Config updated successfully: " + key + " = " + value;}/*** 根据 key 获取配置项的值** @param key 配置项的键* @return 配置项的值*/@GetMapping("/get")public String getConfig(@RequestParam String key) {String value = environmentContext.getProperty(key, "未找到对应的配置项");return key + " = " + value;}}
测试
首先在application.properties配置文件中补充一个参数配置:
server.port=8080
changlu.param=parm1
1)启动服务后,查询下参数信息:changlu.param

正常获取到结果值parm1。
2)接着我们调用update更新参数接口
更新changlu.param参数值为:789

3)此时我们再次查询下该参数:

当前已经得到了最新的参数值为:789
实现刷新当前使用的配置文件
目的
在真实场景下,我们会直接上到服务器上修改配置文件参数,接着想要通过调用接口重新加载该配置文件中的所有参数配置信息。
动作:修改配置文件参数项。
发起:调用/refresh接口实现动态刷新。
代码实现
1、SystemPropertyUtil (实现自定义conf配置路径user.dir.conf )
实际场景中,我们的配置文件不会直接打包在jar包中,通常会指定一个配置文件路径。

SystemPropertyUtil:
import java.io.File;public class SystemPropertyUtil {public static void setSystemUserDir() {String dir = System.getProperty("user.dir");String conf = String.format("%s/%s", dir, "conf");File file = new File(conf);if(!file.exists()) {dir = dir.substring(0, dir.lastIndexOf("/"));conf = String.format("%s/%s", dir, "conf");file = new File(conf);if(file.exists()) {System.setProperty("user.dir", dir);}}System.setProperty("user.dir.conf", System.getProperty("user.dir") + "/conf");}
}
接着在启动器服务运行前调用方法来设置全局变量参数user.dir.conf:

SystemPropertyUtil.setSystemUserDir();
此时我们的配置文件在当前工程目录下的conf中:

配置参数值如下:
server.port=8756
changlu.test=444
2、ConfigFileReloader(实现配置文件加载器)

在加载器中,实现了一个方法会去读取user.dir.conf这个变量路径值,此时得到的是/conf的全路径,接着我们去补充配置文件名application.properties即可:
ConfigFileReloader.java:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertiesPropertySource;
import org.springframework.stereotype.Component;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Properties;@Component
public class ConfigFileReloader {private final ConfigurableEnvironment environment;@Autowiredpublic ConfigFileReloader(ConfigurableEnvironment environment) {this.environment = environment;}/*** 重新加载配置文件** @throws IOException 如果文件读取失败*/public void reloadConfig() throws IOException {Properties properties = new Properties();try (FileInputStream fis = new FileInputStream(System.getProperty("user.dir.conf") + "/application.properties")) {properties.load(fis);}MutablePropertySources propertySources = environment.getPropertySources();propertySources.addFirst(new PropertiesPropertySource("dynamicConfig", properties));}
}
3、EnvironmentContext 指定默认读取配置文件路径参数

补充属性源读取路径信息:PropertySource注解中读取静态变量对应conf路径下application.properties
@Component
@PropertySource(value = "file:${user.dir.conf}/application.properties")
public class EnvironmentContext {
4、实现刷新配置文件参数接口

@Autowired
private ConfigFileReloader configFileReloader;/*** 刷新配置文件** @return 配置项的值*/
@GetMapping("/refresh")
public String refreshConfig() throws IOException {configFileReloader.reloadConfig();return "success";
}
后续步骤就是,我们修改conf下的配置文件参数值,然后调用下生效参数接口即可刷新当前应用服务的配置信息。
测试
确认好配置信息:

接着我们启动服务,来调用下获取参数配置信息接口:正常读取到parm1

接着我们手动将配置文件参数修改:

接着调用刷新配置文件接口:

成功刷新,此时我们再去读取下该配置信息:

当前读取到的配置参数为parm2,刷新文件配置项生效!
相关文章:
SpringBoot支持动态更新配置文件参数
前言 博主介绍:✌目前全网粉丝3W,csdn博客专家、Java领域优质创作者,博客之星、阿里云平台优质作者、专注于Java后端技术领域。 涵盖技术内容:Java后端、大数据、算法、分布式微服务、中间件、前端、运维等。 博主所有博客文件…...
开发技巧,vue 中的动态组件的引用 component + is
在项目中很多时候有切换 tab 的场景,一般来说都是用 v-if 或者 v-show 然后根据各种条件来控制显示隐藏。 其实我们可以使用 vue 中的动态组件,也能实现这个效果 <!-- currentTab 改变时组件也改变 --> <component :is"currentTab"…...
基于SpringBoot+WebSocket的前后端连接,并接入文心一言大模型API
前言: 本片博客只讲述了操作的大致流程,具体实现步骤并不标准,请以参考为准。 本文前提:熟悉使用webSocket 如果大家还不了解什么是WebSocket,可以参考我的这篇博客: rWebSocket 详解:全双工…...
PSD是什么图像格式?如何把PSD转为JPG格式?
在图形设计的世界里,Photoshop 文档(PSD)格式是 Adobe Photoshop 的原生文件格式,它允许设计师保存图像中的图层、蒙版、透明度和不同色彩模式等信息。对于需要进一步编辑的设计作品来说,PSD 文件提供了极大的灵活性。…...
c语言中mysql_query的概念和使用案例
在 C 语言中,使用 MySQL 数据库需要用到 MySQL C API。mysql_query() 函数是 MySQL C API 中的一个函数,用于执行 SQL 语句。 概念 mysql_query() 函数的原型如下: int mysql_query(MYSQL *mysql, const char *stmt_str)mysql:…...
一次端口监听正常,tcpdump无法监听到指定端口报文问题分析
tcpdump命令: sudo tcpdump -i ens2f0 port 6471 -XXnnvvv 下面是各个部分的详细解释: 1.tcpdump: 这是用于捕获和分析网络数据包的命令行工具。 2.-i ens2f0: 指定监听的网络接口。ens2f0 表示本地网卡),即计算机该指定网络接口捕…...
解决InnoDB: Failing assertion: !lock->recursive
背景: 在arm服务器里运行MySQL5.7.22版本 报错信息 : 2024-11-25T08:07:36.24182508:00 856 [Note] Multi-threaded slave statistics for channel : seconds elapsed 126; events assigned 53431297; worker queues filled over overrun level 0; …...
基于微信小程序的外卖点餐系统设计与实现ssm+论文源码调试讲解
4系统概要设计 4.1概述 本系统后台采用B/S结构(Browser/Server,浏览器/服务器结构)和基于Web服务两种模式,是一个适用于Internet环境下的模型结构。只要用户能连上Internet,便可以在任何时间、任何地点使用。系统工作原理图如图4-1所示: 图4-1系统工作原…...
Helm Chart 实现 Kubernetes 应用的多环境部署与镜像更新
在现代软件开发中,通常需要将应用部署到多个环境(如开发环境、测试环境、生产环境),并且在不同环境中使用不同的配置和镜像版本。Helm Chart 提供了强大的模板化和参数化功能,可以轻松实现多环境部署和镜像更新。本文将详细介绍如何使用 Helm Chart 实现 Kubernetes 应用的…...
“腾讯、钉钉、飞书” 会议开源平替,免费功能强大
在数字化时代,远程办公和线上协作越来越火。然而,市面上的视频会议工具要么贵得离谱,要么功能受限,甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet,这可是我在网…...
我谈区域偏心率
偏心率的数学定义 禹晶、肖创柏、廖庆敏《数字图像处理(面向新工科的电工电子信息基础课程系列教材)》P312 区域的拟合椭圆看这里。 Rafael Gonzalez的二阶中心矩的表达不说人话。 我认为半长轴和半短轴不等于特征值,而是特征值的根号。…...
思科交换机telnet配置案例
目录 1.telnet简述2.网络拓扑3.设备说明4.网络配置4.1 电脑PC ip设置4.2 网络交换机telnet配置 5.小结 1.telnet简述 Telnet是远程登录服务的一个协议,该协议定义了远程登录用户与服务器交互的方式。它允许用户在一台联网的计算机上登录到一个远程分时系统中&#…...
机器学习:支持向量机
支持向量机(Support Vector Machine)是一种二类分类模型,其基本模型定义为特征空间上的间隔最大的广义线性分类器,其学习策略便是间隔最大化,最终可转化为一个凸二次规划问题的求解。 假设两类数据可以被 H x : w T x…...
人工智能前沿技术进展与应用前景探究
一、引言 1.1 研究背景与意义 人工智能作为一门极具变革性的前沿技术,正深刻地改变着人类社会的各个层面。从其诞生之初,人工智能便承载着人类对智能机器的无限遐想与探索。自 20 世纪中叶起,人工智能踏上了它的发展征程,历经了…...
(一)HTTP协议 :请求与响应
前言 爬虫需要基础知识,HTTP协议只是个开始,除此之外还有很多,我们慢慢来记录。 今天的HTTP协议,会有助于我们更好的了解网络。 一、什么是HTTP协议 (1)定义 HTTP(超文本传输协议ÿ…...
什么是网络爬虫?Python爬虫到底怎么学?
最近我在研究 Python 网络爬虫,发现这玩意儿真是有趣,干脆和大家聊聊我的心得吧!咱们都知道,网络上的信息多得就像大海里的水,而网络爬虫就像一个勤劳的小矿工,能帮我们从这片浩瀚的信息海洋中挖掘出需要的…...
NR_shell运行流程简析
nr_shell 是一套开源 shell 框架,基于框架可创建终端交互功能。 为了记录终端输入指令,以及进行解析处理,nr_shell 提供了一套 cmd 结构体,具体如下:typedef struct static_cmd_function_struct {char cmd[NR_SHELL_CM…...
CSS Fonts(字体)
CSS Fonts(字体) 在网页设计中,字体是传达信息情感和风格的关键元素。CSS(层叠样式表)提供了丰富的字体样式和属性,使得网页设计者能够根据需求选择合适的字体,从而提升用户体验。本文将详细介绍CSS字体相关的知识,包括字体的选择、加载、样式设置等。 字体的选择 选…...
基于Django的Boss直聘IT岗位可视化分析系统的设计与实现
【Django】基于Django的Boss直聘IT岗位可视化分析系统的设计与实现(完整系统源码开发笔记详细部署教程)✅ 目录 一、项目简介二、项目界面展示三、项目视频展示 一、项目简介 该系统采用Python作为主要开发语言,利用Django这一高效、安全的W…...
linux系统中的 scp的使用方法
SCP(Secure Copy Protocol)是一种通过加密的方式在本地主机和远程主机之间安全地传输文件的协议。 它是基于SSH协议的扩展,允许用户在不同主机之间进行文件复制和传输,是Linux和Unix系统中常用的工具之一。 在嵌入式Linux软件的…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
聊聊 Pulsar:Producer 源码解析
一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台,以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中,Producer(生产者) 是连接客户端应用与消息队列的第一步。生产者…...
全志A40i android7.1 调试信息打印串口由uart0改为uart3
一,概述 1. 目的 将调试信息打印串口由uart0改为uart3。 2. 版本信息 Uboot版本:2014.07; Kernel版本:Linux-3.10; 二,Uboot 1. sys_config.fex改动 使能uart3(TX:PH00 RX:PH01),并让boo…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
【C++进阶篇】智能指针
C内存管理终极指南:智能指针从入门到源码剖析 一. 智能指针1.1 auto_ptr1.2 unique_ptr1.3 shared_ptr1.4 make_shared 二. 原理三. shared_ptr循环引用问题三. 线程安全问题四. 内存泄漏4.1 什么是内存泄漏4.2 危害4.3 避免内存泄漏 五. 最后 一. 智能指针 智能指…...
【JavaSE】多线程基础学习笔记
多线程基础 -线程相关概念 程序(Program) 是为完成特定任务、用某种语言编写的一组指令的集合简单的说:就是我们写的代码 进程 进程是指运行中的程序,比如我们使用QQ,就启动了一个进程,操作系统就会为该进程分配内存…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
第7篇:中间件全链路监控与 SQL 性能分析实践
7.1 章节导读 在构建数据库中间件的过程中,可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中,必须做到: 🔍 追踪每一条 SQL 的生命周期(从入口到数据库执行)&#…...
