<
dependency
>
<
groupId
>
org
.
springframework
.
boot
<
/
groupId
>
<
artifactId
>
spring
-
boot
-
starter
-
web
<
/
artifactId
>
<
/
dependency
>
<
dependency
>
<
groupId
>
org
.
projectlombok
<
/
groupId
>
<
artifactId
>
lombok
<
/
artifactId
>
<
/
dependency
>
<
/
dependencies
>
server
:
port
:
31091
spring
:
profiles
:
active
:
dev
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异常");
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);
* @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;
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 {
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;
@Slf4j
@RestController
public class TestController {
@GetMapping("/getDynamicMail")
public String getDynamicMail() {
String dynamicMail = DynamicMailConfig.getInstance().getDynamicMail();
log.info("getDynamicMail: " + dynamicMail);
return dynamicMail;
- 打包后配置文件放在与
jar
同级的config
目录下
- End -
- 个人笔记 -
- 仅供参考 -
在实际的的开发中,对于一个工程,经常会有多种环境配置,例如开发环境、测试环境、生产环境等。在不同的环境下,配置有可能是不一样的,比如接口地址、数据库连接配置等。为了避免频繁的修改配置文件,我们想要简便地切换各种环境配置。好在SpringBoot提供了这样的功能,可以很方便地切换不同场景下的配置。
本文就来讲解如果在SpringBoot项目中动态切换配置,以及用Maven控制配置的选择。...
spring boot yaml配置文件参数根据程序动态改变
我们的需求是会有不同的数据库,包括oracle,mysql等等,所以yaml文件不能写死读某个库,需要前端切换数据库的时候把配置文件查询库也要切换到对应的上面
话不多说,直接上代码,觉得有帮助的记得点个赞
@SuppressWarnings("all")
public static void updateYamlFile(DatabaseConnect connect) {
String src = "src/main/r