参考

Spring boot源码分析-ApplicationListener应用环境:

https://blog.csdn.net/jamet/article/details/78042486

加载application资源文件源码分析:

https://blog.csdn.net/liaokailin/article/details/48878447

ConfigFileApplicationListener 主要实现了以下接口

    EnvironmentPostProcessor:用于环境的后处理

    SmartApplicationListener:是ApplicationListener的扩展,进一步暴露事件类型。

    Ordered:用于将对象排序

ConfigFileApplicationListener类的解释

 通过类上的注释,我们可以知道关于该类的一些信息,

 1.他默认会从classpath: 、file:./ 、classpath:config/ 、 file:./config/  加载'application.properties' 和/或 'application.yml'

 2.其他配置也会根据active profiles 进行 加载 ,
如 active 此时被设置成 web, spring 加载的时候也会去加载 application-web.properties 和 application-web.yml

加载项目配置文件时,对应 propertySources 的名称如下:

[bootstrap,commandLineArgs,systemProperties,systemEnvironment,
random,servletConfigInitParams,servletContextInitParams,
jndiProperties,applicationConfig: [classpath:/application-console_dev.properties],applicationConfig:
[classpath:/config/application.properties],applicationConfig:
[classpath:/application.properties],bootstrapProperties,applicationConfig:
[classpath:/bootstrap.properties],Management
Server,applicationConfigurationProperties,
defaultProperties,springCloudClientHostInfo]

如果在 applicationConfig 名称的前面添加属性,则项目配置文件中的属性不会覆盖

public class ConsoleDomainPostrocessor implements EnvironmentPostProcessor, Ordered {

    private static final String PROPERTY_SOURCE_NAME = "xxProperties";

    public static final DOMAIN = "domain";

    private int order = ConfigFileApplicationListener.DEFAULT_ORDER + 20;

    private static Map<String, String> consoleUrlList = new HashMap<>();

    static {
consoleUrlList.put("consoletest", "http://ecc.consoletest.jcloudec.com");
} @Override
public int getOrder() {
return order;
} @Override
public void postProcessEnvironment(ConfigurableEnvironment environment, SpringApplication application) { Map<String, Object> map = new HashMap<>(); EccConsoleProperties target = new EccConsoleProperties();
RelaxedDataBinder binder = new RelaxedDataBinder(target,
EccConsoleProperties.ECC_CONSOLE);
binder.bind(new PropertySourcesPropertyValues(environment.getPropertySources())); //默认开启
boolean enabled = target.isEnabled(); if (enabled) {
if (environment.getActiveProfiles().length > 0 &&
(!Arrays.asList(environment.getActiveProfiles()).contains("default"))) { String[] activeProfiles = environment.getActiveProfiles();
String curentConsoleUrl = consoleUrlList.get(activeProfiles[0]); if (StringUtils.isNotBlank(curentConsoleUrl)) {
map.put(DOMAIN, curentConsoleUrl);
} else if (StringUtils.isNotBlank(target.getDomain())) {
map.put(DOMAIN, target.getDomain());
} else {
map.put(DOMAIN, "http://xx.com");
}
System.out.println(String.format("activeProfiles:[%s],console domain:[%s]", activeProfiles[0], map.get(CC_CONSOLE_DOMAIN))); MapPropertySource propertySource = new MapPropertySource(PROPERTY_SOURCE_NAME, map); // 将属性添加到 application 文件前,这样application 就不会覆盖属性了
environment.getPropertySources().addBefore(ConfigFileApplicationListener.APPLICATION_CONFIGURATION_PROPERTY_SOURCE_NAME, propertySource);
}
}
}
}

在 META-INF/spring.factories 文件内容添加

org.springframework.boot.env.EnvironmentPostProcessor=com.xxx.ConsoleDomainPostrocessor

spring boot 自定义属性覆盖application文件属性的更多相关文章

  1. Spring Boot 的配置文件application.properties

    Spring Boot 中的application.properties 是一个全局的配置文件,放在src/main/resources 目录下或者类路径的/config下. 作为全局配置文件的app ...

  2. Spring Boot加载application.properties配置文件顺序规则

    SpringApplication会从以下路径加载所有的application.properties文件: 1.file:./config/(当前目录下的config文件夹) 2.file:./(当前 ...

  3. spring boot 无法读取application.properties问题

    spring boot 无法读取application.properties问题 https://bbs.csdn.net/topics/392374488 Spring Boot 之注解@Compo ...

  4. 一:Spring Boot 的配置文件 application.properties

    Spring Boot 的配置文件 application.properties 1.位置问题 2.普通的属性注入 3.类型安全的属性注入 1.位置问题 当我们创建一个 Spring Boot 工程时 ...

  5. IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示

    在使用spring boot开发过程中,经常会定义一些应用自己的属性,直接写到application配置文件中使用@Value注解进行使用,这样使用也没有什么问题.不过我认为更优雅的方式是定义自己的属 ...

  6. Spring Boot 中配置文件application.properties使用

    一.配置文档配置项的调用(application.properties可放在resources,或者resources下的config文件夹里) package com.my.study.contro ...

  7. Spring Boot 自定义属性 以及 乱码问题

    自定义属性 使用随机数及自定义配置类 中文乱码问题 1添加配置 2设置文件类型 1IDEA 2eclipse 自定义属性 application.properties提供自定义属性的支持,这样我们就可 ...

  8. Spring Boot中配置文件application.properties使用

    一.配置文档配置项的调用 启动后在浏览器直接输入http://localhost:18080/user/test,就直接打印出配置文件中的配置内容. 二.绑定对象bean调用 有时候属性太多了,一个个 ...

  9. 第二篇:彻底搞清楚 Spring Boot 的配置文件 application.properties

    前言 在Spring Boot中,配置文件有两种不同的格式,一个是properties,另一个是yaml. 虽然properties文件比较常见,但是相对于properties而言,yaml更加简洁明 ...

随机推荐

  1. POJ3378_Crazy Thairs

    这个题目很有意思,也是一个很好的题目,涉及的知识点比较广,要求较高. 题目是这样的,给定你一个n个数的数列,问你有多少个长度为5的上升序列. 首先看到有50000,我们就知道肯定不会是DP.(但是不知 ...

  2. bzoj1093[ZJOI2007]最大半连通子图(tarjan+拓扑排序+dp)

    Description 一个有向图G=(V,E)称为半连通的(Semi-Connected),如果满足:?u,v∈V,满足u→v或v→u,即对于图中任意两点u,v,存在一条u到v的有向路径或者从v到u ...

  3. windows上配置连接git

    Windows7上安装Git   我首先是百度到了这个网站:https://git-scm.com/download/win 这个网站上有下载链接,你可以根据你的系统选择不同的下载链接,我的是Win7 ...

  4. day 05 万恶之源-基本数据类型(dict)

    05. 万恶之源-基本数据类型(dict)本节主要内容:1. 字典的简单介绍2. 字典增删改查和其他操作3. 字典的嵌套⼀一. 字典的简单介绍字典(dict)是python中唯⼀一的⼀一个映射类型.他 ...

  5. BZOJ4888 Tjoi2017异或和(树状数组)

    化为前缀和相减.考虑每一位的贡献.则需要快速查询之前有几个数和当前数的差在第k位上为1.显然其与更高位是无关的.于是用BIT维护后k位的数的出现次数,瞎算一算即可. // luogu-judger-e ...

  6. Qt Widgets、QML、Qt Quick的区别

    Qt Widgets.QML.Qt Quick的区别 简述 看了之前关于 QML 的一些介绍,很多人难免会有一些疑惑: Q1:QML 和 Qt Quick 之间有什么区别? Q2:QtQuick 1. ...

  7. Unity3D for VR 学习(9): Unity Shader 光照模型 (illumination model)

    关于光照模型 所谓模型,一般是由学术算法发起, 经过大量实际数据验证而成的可靠公式 现在还记得2009年做TD-SCDMA移动通信算法的时候,曾经看过自由空间传播模型(Free space propa ...

  8. HDU 4383 To The Moon 解题报告

    HDU 4383 To The Moon 题意翻译 已知一个长为\(n\)的序列\(a\),你需要进行下面的四种操作. C l r d 将区间\([l,r]\)中的数加上\(d\),同时时间加\(1\ ...

  9. 基于Memcached分布式系统DRDoS拒绝服务攻击技术研究(转)

    本次反射式拒绝服务攻击技术基于全球互联网分布式的Memcached服务器,需要储备一定得安全攻防知识,网络协议知识和python代码编程技术.希望在学习本篇文章知识前自行学习相关的基础知识,文章后面同 ...

  10. [杂谈]ACM启程

    此处省略一大段传奇的经历. 只需要知道的是,现在再次开始使用本博客的唯一原因就是——我进大学有搞ACM的打算. 其实本来是没有的,受到某学长的指引和推荐,我觉得这条路在当前确切是绝对的优选. 2年没碰 ...