Springboo如何t动态修改配置文件属性

 更新时间:2023年09月16日 15:04:18   作者:kenick  
这篇文章主要介绍了Springboo如何t动态修改配置文件属性问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

Springboot动态修改配置文件属性

package com.kenick.config;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.env.EnvironmentPostProcessor;
import org.springframework.core.env.ConfigurableEnvironment;
import org.springframework.core.env.MapPropertySource;
import org.springframework.core.env.MutablePropertySources;
import org.springframework.core.env.PropertySource;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
public class CustomApplicationProperties implements EnvironmentPostProcessor {
    @Override
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        MutablePropertySources propertySources = environment.getPropertySources();
        // 所有属性文件名
        String env = "";
        Iterator<PropertySource<?>> iterator = propertySources.iterator();
        System.out.println(" ================== 所有配置文件名 ==================");
        while(iterator.hasNext()){
            PropertySource<?> next = iterator.next();
            String configFileName = next.getName();
            System.out.println(configFileName);
            if(configFileName.contains("application-")){ // spring只会加载当前环境配置
                env = configFileName.split("application-")[1].replace(".properties]", "");
            }
        }
        // 获取主配置文件
        String mainName = "applicationConfig: [classpath:/application.properties]";
        MapPropertySource propertySource = (MapPropertySource) propertySources.get(mainName);
        Map<String, Object> source = propertySource.getSource();
        System.out.println(" ================== 主配置 ==================");
        source.forEach((k,v) -> {
            System.out.println(k+":"+v.toString());
        });
        // 获取激活配置文件
        System.out.println("当前环境:" + env);
        String activeName = "applicationConfig: [classpath:/application-" + env + ".properties]";
        MapPropertySource activePropertySource = (MapPropertySource) propertySources.get(activeName);
        Map<String, Object> activeSource = activePropertySource.getSource();
        System.out.println(" ================== 当前配置 ==================");
        Map<String, Object> newConfigMap = new HashMap<>();
        activeSource.forEach((k,v) -> {
            System.out.println(k+":"+v.toString());
            newConfigMap.put(k, v.toString()); // value必须要放入String格式
        });
        // 可动态修改配置
        // newConfigMap.replace("log.custom.test", "E:\\tmp\\logs");
        propertySources.replace(activeName, new MapPropertySource(activeName , newConfigMap));
    }
}

org.springframework.boot.env.EnvironmentPostProcessor=com.kenick.config.CustomApplicationProperties

动态给springBoot配置增加属性

有些时候我们要把代码部署到不同地方,根据地方不同来辨别要执行那些代码,这时就要把一些配置事先配置到数据库在在容器初始化时读取对应数据来执行特定需求。

好处可以把一些配置文件配置到数据库。用到@PostConstruct注解与@DependesOn注解

@PostConstruct注解

配置了此注解方法会在调用构造方法后自动被调用,也可以理解为spring容器初始化的时候执行该方法。

实例代码如下

  @Component
  public class Config3 {
      @Autowired
      private ConfigurableEnvironment environment;
      @PostConstruct
      public void setProvinceCode() {
          MutablePropertySources propertySources = environment.getPropertySources();
          Pattern p = Pattern.compile("^applicationConfig.*");
          for (PropertySource<?> propertySource : propertySources) {
              if (p.matcher(propertySource.getName()).matches()) {
                  Properties properties = new Properties();
                  Map<String, String> map = new HashMap<>();
                  map.put("code","10000000000");
                  properties.putAll(map);
                  PropertiesPropertySource constants = new PropertiesPropertySource("system-config", properties);
                  propertySources.addAfter(propertySource.getName(),constants);
              }
          }
      }
  }

@DependesOn注解

用来表示一个Bean的实例化依赖另一个Bean的实例化

  @DependsOn("config3")
  @Component
  public class Config2 {
      @Value("$[code]")
      private String codeValue;
      public void show() {
          System.out.println(codeValue);
      }
      @Value("$[code]")
      public void setProvinceCode(String codeValue) {
          System.out.println("code:"+codeValue);
      }
  }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 浅析Django接口版本控制

    浅析Django接口版本控制

    一个项目在升级迭代的时候,不会立马抛弃旧的版本,甚至会出现多个版本共存同时维护的情况,因此需要版本控制
    2021-06-06
  • Python 实现数据库(SQL)更新脚本的生成方法

    Python 实现数据库(SQL)更新脚本的生成方法

    当我们需要准备更新脚本的使用,不小心会忘记改动了哪里,所以小编试着用Python来实现自动的生成更新脚本,具体操作方法,大家参考下本文吧
    2017-07-07
  • 基于Django signals 信号作用及用法详解

    基于Django signals 信号作用及用法详解

    这篇文章主要介绍了基于Django signals 信号作用及用法详解,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-03-03
  • Pycharm配置autopep8实现流程解析

    Pycharm配置autopep8实现流程解析

    这篇文章主要介绍了Pycharm配置autopep8实现流程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-11-11
  • Python实现将Word表格嵌入到Excel中

    Python实现将Word表格嵌入到Excel中

    把Word中的表格转到Excel中,顺便做一个调整。这个需求在实际工作中,很多人还是经常碰到的!本文就将介绍如何利用Python实现这一功能,需要的朋友可以了解一下
    2021-12-12
  • python学习将数据写入文件并保存方法

    python学习将数据写入文件并保存方法

    在本篇文章里小编给大家分享的是关于python将数据写入文件并保存的实例内容,需要的朋友们可以学习下。
    2020-06-06
  • python利用requests库进行接口测试的方法详解

    python利用requests库进行接口测试的方法详解

    在python的标准库中,虽然提供了urllib,utllib2,httplib,但是做接口测试,requests真心好,正如官方说的,“让HTTP服务人类”,一言以蔽之,说明一切,这篇文章主要给大家介绍了关于python利用requests库进行接口测试的相关资料,需要的朋友可以参考下
    2018-07-07
  • 详解使用Python处理文件目录的相关方法

    详解使用Python处理文件目录的相关方法

    这篇文章主要介绍了使用Python处理文件目录的相关方法,使用到了os模块,需要的朋友可以参考下
    2015-10-10
  • python内置函数:lambda、map、filter简单介绍

    python内置函数:lambda、map、filter简单介绍

    Python 内置了一些比较特殊且实用的函数,使用这些能使你的代码简洁而易读。下面对python内置函数:lambda、map、filter简单介绍下,需要的朋友参考下吧
    2017-11-11
  • python开发中两个list之间传值示例

    python开发中两个list之间传值示例

    这篇文章主要介绍了python开发中两个list列表之间传值的方法,有需要的朋友可以借鉴参考下,希望可以有所帮助,希望大家共同学习,共同进步
    2021-09-09

最新评论