SpringBoot动态修改yml配置文件的方法详解
作者:Maggieq8324 发布时间:2023-06-20 16:14:34
标签:SpringBoot,动态,修改,配置文件
前言
记录下SpringBoot
修改yml
配置文件后无需重启服务的方式(打包后生效),效果如下:
具体实现
实现代码
pom.xml
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
application.yml
#端口号
server:
port: 31091
spring:
profiles:
active: dev
application-dev.yml
coisini:
mail: maggieq8324@gmail.com
InitializationConfig.java
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.stereotype.Component;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* @Description spring容器初始化完成后进行一些其他初始化操作
* @date Mar 24, 2022
* @version 1.0
*/
@Slf4j
@Component
public class InitializationConfig implements ApplicationRunner {
private static ScheduledExecutorService executorService = Executors.newScheduledThreadPool(1);
private static String profile;
@Override
public void run(ApplicationArguments applicationArguments) throws Exception {
scheduleUpdateConf();
}
private void scheduleUpdateConf() {
try {
Map lhm = YmlUtil.loadYaml("application.yml");
profile = (String) YmlUtil.getValByKey(lhm, "spring.profiles.active");
} catch (Exception e) {
log.error("加载配置文件application.yml异常");
}
// TODO 开启定时刷新内存中配置文件内容
log.info("refresh config file start");
executorService.scheduleAtFixedRate(InitializationConfig::updateConfVal, 0, 10, TimeUnit.SECONDS);
log.info("refresh config file end");
}
/**
* 更新配置文件值
*/
private static void updateConfVal(){
try{
Map lhm = YmlUtil.loadYaml("application-" + profile + ".yml");
String mail = YmlUtil.getValByKey(lhm,"coisini.mail").toString();
DynamicMailConfig instance = DynamicMailConfig.getInstance();
if (!instance.getDynamicMail().equals(mail)) {
instance.setDynamicMail(mail);
log.info("实时配置mail更新:" + instance.getDynamicMail());
}
} catch (Exception e){
log.error("更新配置文件值异常: ", e);
}
}
}
DynamicMailConfig.java
/**
* @Description 动态邮箱单例
* @date Mar 24, 2022
* @version 1.0
*/
public class DynamicMailConfig {
private static String mail;
private final static DynamicMailConfig dynamic;
static {
dynamic = new DynamicMailConfig();
}
private DynamicMailConfig() {
mail = "";
}
public static DynamicMailConfig getInstance() {
return dynamic;
}
public String getDynamicMail() {
return mail;
}
public void setDynamicMail(String mail) {
this.mail = mail;
}
}
YmlUtil.java
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.LinkedHashMap;
import java.util.Map;
/**
* @Description 动态操作yml配置文件工具类
* 【需要将config配置文件夹和项目jar包放在同级别目录下,这样修改config下的配置文件后,jvm才能及时得获取新的配置】
* @date Mar 24, 2022
* @version 1.0
*/
public class YmlUtil {
public static LinkedHashMap loadYaml(String fileName) throws Exception{
String path = System.getProperty("user.dir");
File file = new File(path + "/config/" + fileName);
InputStream in;
if (file.exists()) {
in = new FileInputStream(path + "/config/" + fileName);
} else {
// TODO 如果没有config文件夹,则从项目的resources目录下找
in = YmlUtil.class.getClassLoader().getResourceAsStream(fileName);
}
LinkedHashMap lhm = new Yaml().loadAs(in, LinkedHashMap.class);
return lhm;
}
public static Object getValByKey(Map lhm, String key) throws Exception{
String[] keys = key.split("[.]");
Map ymlInfo = lhm;
for (int i = 0; i < keys.length; i++) {
Object value = ymlInfo.get(keys[i]);
if (i < keys.length - 1) {
ymlInfo = (Map) value;
} else if (value == null) {
throw new Exception("key不存在");
} else {
return value;
}
}
return null;
}
}
测试
TestController.java
@Slf4j
@RestController
public class TestController {
@GetMapping("/getDynamicMail")
public String getDynamicMail() {
String dynamicMail = DynamicMailConfig.getInstance().getDynamicMail();
log.info("getDynamicMail: " + dynamicMail);
return dynamicMail;
}
}
打包后配置文件放在与jar
同级的config
目录下
源码
GitHub
:https://github.com/Maggieq8324/java-learn-demo/tree/master/springboot-dynamic-yml
Gitee
:https://gitee.com/maggieq8324/java-learn-demo/tree/master/springboot-dynamic-yml
来源:https://blog.csdn.net/weixin_41182727/article/details/123798296


猜你喜欢
- class文件中的attributes_count和attributesattributes_count位于class文件中methods的
- 1 异常异常的体系• ThrowableError通常出现重大问题如:运行的类不存在或者内存溢出等。不编写针对代码对其处理Exception
- 前言:在工作中一次排查慢接口时,查到了一个函数耗时较长,最终定位到是通过 List 去重导致的。由于测试环境还有线上早期数据较少,这个接口的
- package com.wa.xwolf.sblog.util;import java.io.BufferedInputStre
- WebSocket介绍WebSocket是HTML5开始提供的一种在单个 TCP 连接上进行全双工通讯的协议。在WebSocket API中
- Android 11文件管理权限申请Android 11文件管理权限申请,为什么需要这个权限,因为在Android 11后,无法直接在SDc
- 进行数据源或者 FTP 服务器等资源配置时,我们可以将这些配置信息放到一个独立的外部属性文件中,并在 Spring 配置文件中通过形如 ${
- Android SDK Manager更新、下载速度慢问题解决办法解决Android SDK Manager更新、下载速度慢打开目录 C:\
- 我这里主要是对串口类的简单使用,实现的功能是以读写方式打开串口,点击发送数据按钮将发送区的数据发送到缓冲区,然后在接收区显示出来,界面如下:
- 前言在手写sql的时候,根据参数处理查询条件.select * from staff where 1 = 1 and staff_id in
- 在Android中实现菜单功能有多种方法。 Options Menu:用户按下menu Button时显示的菜单。 Context Menu
- 这篇文章主要介绍了spring如何实现两个xml配置文件间的互调,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 微服务治理Spring Cloud 工具套件为微服务治理提供了全面的技术支持。这些治理工具主要包括服务的注册与发现、负载均衡管理、动态路由、
- 本文实例讲述了C#中事务处理和非事务处理方法。分享给大家供大家参考。具体如下:C#代码如下:String connectionString
- 前言如果你了解过 Liunx ,了解过 Liunx 的中管道命令 | ,那么你会发现,其实 Java 8 的 stream 和 Liunx
- 1.Knife4j在线API文档基本使用Knife4j是一款基于Swagger 2的在线API文档框架。使用Knife4j的基础步骤:添加依
- 1、安装依赖<dependency> <
- 背景 最近在工作中遇到一个需求,需要在接收到推送的时候将推送获得的数据存起来,以供app启动时使用。我们会认为这不是So eas
- Redisson分布式锁之前的基于注解的锁有一种锁是基本redis的分布式锁,锁的实现我是基于redisson组件提供的RLock,这篇来看
- 反射机制Java语言提供的一种基础功能,通过反射,我们可以操作这个类或对象,比如获取这个类中的方法、属性和构造方法等。 * :分为JDK动