栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

SpringBoot扩展外部化配置--基于SpringBoot2.5.7

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SpringBoot扩展外部化配置--基于SpringBoot2.5.7

SpringBoot扩展外部化配置

Spring Boot允许您外部化配置,这样您就可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java属性文件、YAML文件、环境变量和命令行参数,通过外部化配置调整应用行为。

SpringBoot 提供的外部化配置有哪些

优先级大的属性或覆盖优先级小的属性值

优先级来源说明
1Default properties (specified by setting SpringApplication.setDefaultProperties).SpringApplication.setDefaultProperties设置
2@PropertySource annotations@PropertySource指定的配置
3Config data (such as application.properties files).application-XX.yml或Properties
4RandomValuePropertySourceSpringBoot 默认提供随机数属性 具体实现类RandomValuePropertySourceEnvironmentPostProcessor
5OS environment variables操作系统环境变量 具体实现类SystemEnvironmentPropertySourceEnvironmentPostProcessor
6Java System properties (System.getProperties()).jvm虚拟机环境变量
7JNDI attributes from java:comp/envJNDI环境属性
8ServletContext init parametersservlet上下文初始化参数
9ServletConfig init parametersservlet配置初始化参数
10Properties from SPRING_APPLICATION_JSON通过环境变量或系统属性指定的spring.application.json 可以参考
11Command line arguments.命令行
12properties attribute on your tests通过@SpringBootTest指定的配置
13@TestPropertySource annotations on your tests@TestProperty指定的配置
14Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active通过Devtools 指定目录下的配置文件
SpringBoot 外部化配置常用场景
  1. @Value 注解 通过注入获取配置属性参数
  2. Spring Environment 读取配置属性参数
  3. @ConfigurationProperties 加载外部配置装配成一个Bean
  4. @ConditionalOnProperty 判断
  5. XML配置文件属性占位符
自定义实现外部化配置 官方建议实现–实现EnvironmentPostProcessor接口
  1. 实现EnvironmentPostProcessor接口
    类图
  2. 自定义实现EnvironmentPostProcessor,并在Spring.factories文件中添加org.springframework.boot.env.EnvironmentPostProcessor=com.github.bearboy80.tomcat.MyEnvironmentPostProcessor
public class MyEnvironmentPostProcessor implements EnvironmentPostProcessor {

    private final YamlPropertySourceLoader loader = new YamlPropertySourceLoader();

    @Override
    //关键点:实现逻辑处理,并加propertySoure 添加到environment中
    public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) {
        Resource path = new ClassPathResource("com/example/myapp/config.yml");
        PropertySource propertySource = loadYaml(path);
        environment.getPropertySources().addLast(propertySource);
    }

    private PropertySource loadYaml(Resource path) {
        Assert.isTrue(path.exists(), () -> "Resource " + path + " does not exist");
        try {
            return this.loader.load("custom-resource", path).get(0);
        }
        catch (IOException ex) {
            throw new IllegalStateException("Failed to load yaml configuration from " + path, ex);
        }
    }
}
  1. 可以参考官方简单实现类:RandomValuePropertySourceEnvironmentPostProcessor
其他实现
  • 基于ApplicationEnvironmentPreparedEvent实现
  • 基于ApplicationContextInitializer实现
  • 基于ApplicationPreparedEvent事件实现
总结

SpringBoot本身提供很好的机制来帮助我们实现自定义属性装载,建议如果扩展外部化属性,通过实现EnvironmentPostProcessor类来作扩展。

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/672377.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号