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);
      }
  }

总结

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

相关文章

  • 使用Python高效实现删除PDF中的超链接

    使用Python高效实现删除PDF中的超链接

    在数字文档时代,PDF文件因其跨平台兼容性和版式固定性,成为信息交换的常用载体,本文将引导你使用一个高效的Python库,轻松实现PDF超链接的批量删除,感兴趣的小伙伴可以了解下
    2025-10-10
  • 我用Python抓取了7000 多本电子书案例详解

    我用Python抓取了7000 多本电子书案例详解

    这篇文章主要介绍了我用Python抓取了7000 多本电子书案例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-03-03
  • 从基础到高级详解Python对象序列化的实战指南

    从基础到高级详解Python对象序列化的实战指南

    在软件开发中,对象序列化是一项至关重要的技术,它允许将内存中的复杂对象转换为可以存储或传输的格式,本文将展示如何在不同场景下选择和应用最合适的序列化方案,下面就跟随小编一起了解下吧
    2025-09-09
  • Python之split函数的深入理解

    Python之split函数的深入理解

    split函数主要应用场景是Python对字符串的处理中(数据分析,数据处理),以及计算机二级考试的常考基础知识点,这篇文章主要介绍了Python之split函数的详解,需要的朋友可以参考下
    2023-02-02
  • pd.drop_duplicates删除重复行的方法实现

    pd.drop_duplicates删除重复行的方法实现

    drop_duplicates 方法实现对数据框 DataFrame 去除特定列的重复行,本文主要介绍了pd.drop_duplicates删除重复行的方法实现,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-06-06
  • Python实现简单的代理服务器

    Python实现简单的代理服务器

    这篇文章主要介绍了Python实现简单的代理服务器,可实现代理服务器基本的包转发功能,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    python 利用pywifi模块实现连接网络破解wifi密码实时监控网络

    这篇文章主要介绍了python 利用pywifi模块实现连接网络破解wifi密码实时监控网络,需要的朋友可以参考下
    2019-09-09
  • Python sep参数使用方法详解

    Python sep参数使用方法详解

    这篇文章主要介绍了Python sep参数使用方法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Python Datetime模块和Calendar模块用法实例分析

    Python Datetime模块和Calendar模块用法实例分析

    这篇文章主要介绍了Python Datetime模块和Calendar模块用法,结合实例形式分析了Python日期时间及日历相关的Datetime模块和Calendar模块原理、用法及操作注意事项,需要的朋友可以参考下
    2019-04-04
  • Python保存环境方式(导出requirements.txt文件)

    Python保存环境方式(导出requirements.txt文件)

    这篇文章主要介绍了Python保存环境方式(导出requirements.txt文件),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-04-04

最新评论