前言
记录下SpringBoot
修改yml
配置文件后无需重启服务的方式(打包后生效),效果如下:
具体实现
实现代码
pom.xml
1
2
3
4
5
6
7
8
9
10
|
< 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
1
2
3
4
5
6
|
#端口号 server: port: 31091 spring: profiles: active: dev |
application-dev.yml
1
2
|
coisini: mail: maggieq8324 @gmail .com |
InitializationConfig.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
|
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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
/** * @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
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
|
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
1
2
3
4
5
6
7
8
9
10
|
@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