springboot如何使用自定义配置文件
从前边《springboot竟然有5种默认的加载路径,你未必都知道》我们知道,springboot会默认加载application.properties/application.yml配置文件,且会从下面5个默认的路径下加载,其优先级依次升高,后面的会覆盖前边的配置。我们平时使用resources/application.properties其实优先级是最低。
// Note the order is from least to most specific (last one wins)
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/*/,file:./config/";
既然知道了springboot会从默认的路径加载默认的配置文件application.properties/application.yml,那么必然可以自定义。
一、如何自定义
这里分为两部分,一个是自定义配置文件,一个是自定义配置文件的路径。秘密就藏在上篇文章提到的一个类中:ConfigFileApplicationListener,再来看下该类的注释,下面仅贴出部分,
* <p>
* The 'spring.config.name' property can be used to specify an alternative name to load
* and the 'spring.config.location' property can be used to specify alternative search
* locations or specific files.
* <p>
这段注释是什么意思呐,大体意思是“通过指定spring.config.name属性来替代默认的配置文件名称,通过指定spring.config.location属性来替代默认配置文件的加载路径”。再来看ConfigFileApplicationListener类中的属性,
/**
* The "config name" property name.
*/
public static final String CONFIG_NAME_PROPERTY = "spring.config.name";
/**
* The "config location" property name.
*/
public static final String CONFIG_LOCATION_PROPERTY = "spring.config.location";
可以看到在该类中定义了两个常量来接收“spring.config.name”和“spring.config.location”属性的值。
二、如何使用
上面已经了解到可以通过配置“spring.config.name”和“spring.config.location”属性值来自定义默认配置文件和默认配置文件的加载路径。现在就来试试,使用properties文件来演示,在resources文件夹下建myconfig/custom.properties,

现在,如果启动服务肯定不会使用端口“9099”,因为前边说到springboot有自己的默认加载路径及默认的配置文件名,现在自定义的文件是resources/myconfig/custome.properties,springboot不会加载到,前边又说到springboot定义了“spring.config.name”和“spring.config.location”两个属性,现在就需要使用这两个属性指定自定义的配置文件。
2.1、从源码中学习如何使用
要指定如何使用“spring.config.name”和“spring.config.location”两个配置,还是得去源码中寻找,前面说到这两个属性在ConfigFileApplicationListener类中,在该类中在下面的地方使用了这两个属性,
private Set<String> getSearchNames() {
//使用CONFIG_NAME_PROPERTY常量也就是spring.config.name
if (this.environment.containsProperty(CONFIG_NAME_PROPERTY)) {
String property = this.environment.getProperty(CONFIG_NAME_PROPERTY);
Set<String> names = asResolvedSet(property, null);
names.forEach(this::assertValidConfigName);
return names;
}
return asResolvedSet(ConfigFileApplicationListener.this.names, DEFAULT_NAMES);
}
private Set<String> getSearchLocations() {
Set<String> locations = getSearchLocations(CONFIG_ADDITIONAL_LOCATION_PROPERTY);
//使用CONFIG_LOCATION_PROPERTY常量也就是spring.config.location
if (this.environment.containsProperty(CONFIG_LOCATION_PROPERTY)) {
locations.addAll(getSearchLocations(CONFIG_LOCATION_PROPERTY));
}
else {
locations.addAll(
asResolvedSet(ConfigFileApplicationListener.this.searchLocations, DEFAULT_SEARCH_LOCATIONS));
}
return locations;
}
从上面的代码中得出这样一个规律都是调用this.environment 中的方法,那么这个environment到底是什么,如下

完全看不出来,这时候只有通过debug了,在ConfigFileApplicationListener类中打上断点,看到environment是一个StandardServletEnvironment实例,

那就好办了,找到该类即可,该类中有这样的一个方法:customizePropertySources,直译过来是“自定义属性来源”,
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
propertySources.addLast(new StubPropertySource(SERVLET_CONFIG_PROPERTY_SOURCE_NAME));
propertySources.addLast(new StubPropertySource(SERVLET_CONTEXT_PROPERTY_SOURCE_NAME));
if (JndiLocatorDelegate.isDefaultJndiEnvironmentAvailable()) {
propertySources.addLast(new JndiPropertySource(JNDI_PROPERTY_SOURCE_NAME));
}
super.customizePropertySources(propertySources);
}
从该类中可以看到向propertySources中新加了好几个属性,我们看下面这句,
super.customizePropertySources(propertySources);
调用的是父类的方法,父类方法如下,
@Override
protected void customizePropertySources(MutablePropertySources propertySources) {
propertySources.addLast(
new PropertiesPropertySource(SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME, getSystemProperties()));
propertySources.addLast(
new SystemEnvironmentPropertySource(SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME, getSystemEnvironment()));
}
看到又向propertySources中放入了两个值,分别是下面两个常量,
/** System environment property source name: {@value}. */
public static final String SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME = "systemEnvironment";
/** JVM system properties property source name: {@value}. */
public static final String SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME = "systemProperties";
根据注释我们知道,
SYSTEM_ENVIRONMENT_PROPERTY_SOURCE_NAME 表示的是系统环境参数
SYSTEM_PROPERTIES_PROPERTY_SOURCE_NAME 表示的是JVM系统参数
也就是说springboot会从系统环境变量和JVM参数中读取配置信息,结合前边的分析,“spring.config.name”和“spring.config.location”会从系统环境变量和JVM参数中获取。
2.2、配置系统环境变量和JVM参数
前边已经从源码中知道了“spring.config.name”和“spring.location”应该如何配置,现在看下配置效果。
2.2.1、配置JVM参数
配置JVM参数看下效果,配置如下,
-Dspring.config.name=custom
-Dspring.config.location=classpath:myconfig/
配置好的效果如下,

看下服务在哪个端口启动,

服务在端口“9099”启动,使用到了我们自定义的配置文件:resources/myconfig/custom.properties。
2.2.2、配置系统环境变量
配置的信息如下,
spring.config.name=custom
spring.config.location=classpath:myconfig/
配置好的效果,

测试结果,我就不再贴了,服务使用的我们自定义的配置文件。
读到这里不知道小伙伴们是否有个疑惑,JVM参数和系统环境变量有优先级吗,当然是有的,咱们继续。
2.3、优先级之争
在resources下再建myconfig2/custom.properties文件,端口为9098,

分别配置JVM参数和系统环境变量,

最后服务是在端口“9099”启动,

由此我们可以得出结论,JVM参数的优先级大于系统环境变量。
三、总结
本文主要分享了在springboot中如何使用自定义的配置文件,主要有以下几点
1、定义自己的配置文件;
2、使用“spring.config.name”、“spring.config.location”定义文件名称、文件位置;
3、可以在JVM参数、系统环境变量配置“spring.config.name”、“spring.config.location”;JVM参数的优先级大于系统环境变量;
不知道有没有小伙伴还存在一个疑问,我是有疑问的,什么是JVM参数?什么是系统环境变量?后续咱们继续分享。
推荐阅读
《springboot竟然有5种默认的加载路径,你未必都知道》
《springboot:读取application.yml文件》

springboot如何使用自定义配置文件的更多相关文章
- SpringBoot系列——加载自定义配置文件
前言 SpringBoot启动时默认加载bootstrap.properties或bootstrap.yml(这两个优先级最高).application.properties或application. ...
- Springboot读取配置文件及自定义配置文件
1.创建maven工程,在pom文件中添加依赖 <parent> <groupId>org.springframework.boot</groupId> <a ...
- springboot读取自定义配置文件节点
今天和大家分享的是自定义配置信息的读取:近期有写博客这样的计划,分别交叉来写springboot方面和springcloud方面的文章,因为springboot预计的篇章很多,这样cloud的文章就需 ...
- SpringBoot之加载自定义配置文件
SpringBoot默认加载配置文件名为:application.properties和application.yml,如果需要使用自定义的配置文件,则通过@PropertySource注解指定. J ...
- Springboot 之 自定义配置文件及读取配置文件
本文章来自[知识林] 读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两 ...
- Springboot 之 自定义配置文件及读取配置文件注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以(下划线的坑,坑了我两天..特此纪念)
注意:配置文件中的字符串不要有下划线 .配置中 key不能带下划线,value可以 错误的.不能读取的例子: mySet .ABAP_AS_POOLED = ABAP_AS_WITH_P ...
- Springboot读取自定义配置文件的几种方法
一.读取核心配置文件 核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单. ...
- SpringBoot读取自定义配置文件
自定义配置文件 my-config.properties bfxy.title=bfxy bfxy.name=hello spring boot! bfxy.attr=12345 配置文件类 appc ...
- springboot下自定义配置文件,并在项目里读取的方法
首先 pom文件引入springboot文件处理器 <dependency> <groupId>org.springframework.boot</groupId> ...
随机推荐
- snippet,让你编码效率翻倍
为什么谈到Snippet 今天下午在用vscode做小程序的时候,发现很不方便,因为商店里提供的代码片段极为有限,而且平时几乎每天都需要用到代码片段,所以就在思考他们是怎么做到给别人提供代码的,我可以 ...
- java中什么叫覆盖Override?请给实例
5.覆盖(Override) 马克-to-win:方法的覆盖(Override)是指子类重写从父类继承来的一个同名方法(参数.返回值也同). 例1.5.1-- class AAAMark_to_win ...
- URLDNS反序列化链学习
URLDNS URLDNS跟CommonsCollections比起来真是眉清目秀,该链主要用于验证漏洞,并不能执行命令,优点就是不依赖任何包. 1.利用链 * Gadget Chain: * Has ...
- Shiro+springboot+mybatis+EhCache(md5+salt+散列)认证与授权-03
从上文:Shiro+springboot+mybatis(md5+salt+散列)认证与授权-02 当每次进行刷新时,都会从数据库重新查询数据进行授权操作,这样无疑给数据库造成很大的压力,所以需要引入 ...
- nfs客户端的一次处理
为什么要说这个呢,由于节点环境不一致,导致在重建pod时,我们暂且叫该pod为 cxpod,cxpod所在宿主机出现了问题现象如下:一.cxpod始终处于创建中 ContainerCreating [ ...
- 帝国cms发布文章对哪些数据表做了操作
帝国cms 发布一篇文章会影响哪些数据表 insert into phome_enewsfile_1(pubid,filename,filesize,adduser,path,filetime,cla ...
- 前端CSS基础
一:CSS 1.什么是CSS? CSS(Cascading Style Sheet,层叠样式表)定义如何显示HTML元素. 当浏览器读到一个样式表,它就会按照这个样式表来对文档进行格式化(渲染). C ...
- 安卓记账本开发学习day5之版本兼容问题
安卓5.0以上版本想要隐藏DatePicker头布局的写法比较复杂,需要一层一层隐藏 int headerId = getContext().getResources().getIdentifier( ...
- 【PostgreSQL】入门学习笔记
前言: 以下内容为前几天在备考PostgreSQL入门考试时候做的笔记,经过了全职的两天的奋战与实验,并最终顺利通过了PCA初级认证考试.现在把我学习的笔记分享给大家,文中有对应的思维导图图片可供 ...
- selenium模块跳过用户名密码验证码输入,加载浏览器标签和cookie,进行翻页爬虫多页动态加载的数据(js)
能解决登陆一次后,之后不需要二次登陆的动态加载数据,网页保存的cookie和标签,加入到selenium自动化测试浏览器中 1 from selenium import webdriver 2 imp ...