SpringBoot動(dòng)態(tài)修改yml配置文件的方法詳解
前言
記錄下SpringBoot修改yml配置文件后無(wú)需重啟服務(wù)的方式(打包后生效),效果如下:

具體實(shí)現(xiàn)
實(shí)現(xiàn)代碼
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
#端口號(hào)
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容器初始化完成后進(jìn)行一些其他初始化操作
* @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 開(kāi)啟定時(shí)刷新內(nèi)存中配置文件內(nèi)容
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("實(shí)時(shí)配置mail更新:" + instance.getDynamicMail());
}
} catch (Exception e){
log.error("更新配置文件值異常: ", e);
}
}
}
DynamicMailConfig.java
/**
* @Description 動(dòng)態(tài)郵箱單例
* @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 動(dòng)態(tài)操作yml配置文件工具類
* 【需要將config配置文件夾和項(xiàng)目jar包放在同級(jí)別目錄下,這樣修改config下的配置文件后,jvm才能及時(shí)得獲取新的配置】
* @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 如果沒(méi)有config文件夾,則從項(xiàng)目的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;
}
}
測(cè)試
TestController.java
@Slf4j
@RestController
public class TestController {
@GetMapping("/getDynamicMail")
public String getDynamicMail() {
String dynamicMail = DynamicMailConfig.getInstance().getDynamicMail();
log.info("getDynamicMail: " + dynamicMail);
return dynamicMail;
}
}
打包后配置文件放在與jar同級(jí)的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
總結(jié)
本篇文章就到這里了,希望能夠給你帶來(lái)幫助,也希望您能夠多多關(guān)注腳本之家的更多內(nèi)容!
相關(guān)文章
SpringCloud?LoadBalancerClient?負(fù)載均衡原理解析
LoadBalancerClient?是?SpringCloud?提供的一種負(fù)載均衡客戶端,Ribbon?負(fù)載均衡組件內(nèi)部也是集成了?LoadBalancerClient?來(lái)實(shí)現(xiàn)負(fù)載均衡,本文給大家深入解析?LoadBalancerClient?接口源碼,感興趣的朋友跟隨小編一起看看吧2022-02-02
Java輸入處理的常見(jiàn)錯(cuò)誤小結(jié)
在?Java?編程中,輸入處理是一個(gè)基礎(chǔ)但又復(fù)雜的任務(wù),尤其是在涉及到與用戶交互時(shí),本文將對(duì)?Java?輸入處理的基本機(jī)制進(jìn)行詳細(xì)解析,需要的可以了解下2024-11-11
Collections.shuffle()方法實(shí)例解析
這篇文章主要介紹了Collections.shuffle()方法實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下2018-01-01
Spring Data JPA實(shí)現(xiàn)排序與分頁(yè)查詢超詳細(xì)流程講解
在介紹Spring Data JPA的時(shí)候,我們首先認(rèn)識(shí)下Hibernate。Hibernate是數(shù)據(jù)訪問(wèn)解決技術(shù)的絕對(duì)霸主,使用O/R映射技術(shù)實(shí)現(xiàn)數(shù)據(jù)訪問(wèn),O/R映射即將領(lǐng)域模型類和數(shù)據(jù)庫(kù)的表進(jìn)行映射,通過(guò)程序操作對(duì)象而實(shí)現(xiàn)表數(shù)據(jù)操作的能力,讓數(shù)據(jù)訪問(wèn)操作無(wú)須關(guān)注數(shù)據(jù)庫(kù)相關(guān)的技術(shù)2022-10-10
MyBatis實(shí)戰(zhàn)之Mapper注解的示例
本文主要介紹了MyBatis實(shí)戰(zhàn)之Mapper注解的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-10-10

