spring boot 自定义属性覆盖application文件属性
参考
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文件属性的更多相关文章
- Spring Boot 的配置文件application.properties
Spring Boot 中的application.properties 是一个全局的配置文件,放在src/main/resources 目录下或者类路径的/config下. 作为全局配置文件的app ...
- Spring Boot加载application.properties配置文件顺序规则
SpringApplication会从以下路径加载所有的application.properties文件: 1.file:./config/(当前目录下的config文件夹) 2.file:./(当前 ...
- spring boot 无法读取application.properties问题
spring boot 无法读取application.properties问题 https://bbs.csdn.net/topics/392374488 Spring Boot 之注解@Compo ...
- 一:Spring Boot 的配置文件 application.properties
Spring Boot 的配置文件 application.properties 1.位置问题 2.普通的属性注入 3.类型安全的属性注入 1.位置问题 当我们创建一个 Spring Boot 工程时 ...
- IDEA开发spring boot应用时 application.yml 或 application.properties 自定义属性提示
在使用spring boot开发过程中,经常会定义一些应用自己的属性,直接写到application配置文件中使用@Value注解进行使用,这样使用也没有什么问题.不过我认为更优雅的方式是定义自己的属 ...
- Spring Boot 中配置文件application.properties使用
一.配置文档配置项的调用(application.properties可放在resources,或者resources下的config文件夹里) package com.my.study.contro ...
- Spring Boot 自定义属性 以及 乱码问题
自定义属性 使用随机数及自定义配置类 中文乱码问题 1添加配置 2设置文件类型 1IDEA 2eclipse 自定义属性 application.properties提供自定义属性的支持,这样我们就可 ...
- Spring Boot中配置文件application.properties使用
一.配置文档配置项的调用 启动后在浏览器直接输入http://localhost:18080/user/test,就直接打印出配置文件中的配置内容. 二.绑定对象bean调用 有时候属性太多了,一个个 ...
- 第二篇:彻底搞清楚 Spring Boot 的配置文件 application.properties
前言 在Spring Boot中,配置文件有两种不同的格式,一个是properties,另一个是yaml. 虽然properties文件比较常见,但是相对于properties而言,yaml更加简洁明 ...
随机推荐
- 超强汇总!110 道 Python 面试笔试题
https://mp.weixin.qq.com/s/hDQrimihoaHSbrtjLybZLA 今天给大家分享了110道面试题,其中大部分是巩固基本python知识点,希望刚刚入手python,对 ...
- PHP关于传众多参数还是传上下文对象的性能测试
在开发微信公众平台平台的过程中,有这么几个参数总是需要传来传去,$userOpenId,$message,$time. 在整个程序的运行过程中,为了函数方便的处理,将这三个变量一直放在参数列表里.关于 ...
- 【C++】不要在构造函数或析构函数内调用虚函数
这个问题来自于<Effective C++>条款9:永远不要在构造函数或析构函数中调用虚函数 . 假设有如下代码: class Transaction {// 所有交易的基类 public ...
- node web 应用热更新
在每次更改完 node.js 项目后,我们都需要先将 node.js停止(快捷键: Ctrl+C),然后再通过命令再次运行,这样特别麻烦.这里我推荐使用 supervisor工具, npm 安装命令为 ...
- js简易随机打乱数组方法
打乱随机数算法很多,不过看这个还挺简便的,记录下来. function shuffle(a) { var len = a.length; for(var i=0;i<len;i++){ var ...
- AtCoder Regular Contest 083 D: Restoring Road Network
题意 有一张无向带权连通图(点数<=300),给出任意两点i,j之间的最短路长度dis[i][j].问是否存在一张这样的无向图.如果不存在输出-1.如果存在输出所有这样的无向图中边权和最小的一张 ...
- 【bzoj4244】邮戳拉力赛 背包dp
题目描述 IOI铁路是由N+2个站点构成的直线线路.这条线路的车站从某一端的车站开始顺次标号为0...N+1. 这条路线上行驶的电车分为上行电车和下行电车两种,上行电车沿编号增大方向行驶,下行电车沿编 ...
- day 05 万恶之源-基本数据类型(dict)
05. 万恶之源-基本数据类型(dict)本节主要内容:1. 字典的简单介绍2. 字典增删改查和其他操作3. 字典的嵌套⼀一. 字典的简单介绍字典(dict)是python中唯⼀一的⼀一个映射类型.他 ...
- pyhcarm github
1.主题 介绍如何用Pycharm实打实的创建.运行.调试程序. 2.准备工作 Pycharm版本为2.7或者更高. 至少安装一个Python解释器,2.4到3.3均可 3.下载安装Pycharm 下 ...
- 【Java】数组升序和降序
int[] x={1,6,4,8,6,9,12,32,76,34,23}; 升序: Arrays.sort(x); 降序: resort(x); public int[] resort(int[] n ...