application.properties文件中暗藏玄机
上次分享了如何一步一步搭建一个springboot的项目,详细参见《5分钟快速搭建一个springboot的项目》,最终的结果是在”8080“端口搭建起了服务,并成功访问。不知道有小伙伴是否有疑惑,springboot应该有配置文件的,一般的配置文件都是application.properties或者application.yml,的确是这样的。但是我确实没有这些配置文件,服务正常在”8080“端口启动,这是因为在springboot内部有一套默认的机制。今天不聊这些默认的机制,聊一聊application.properties/application.yml文件。
一、application.properties/.yml文件初识
前面说到没有配置application.properties文件,现在我在main/resources文件夹下新建一个application.properties文件,并且写上如下的配置

然后,启动项目,

好了,通过上面的启动结果截图,看到服务在端口”9090“启动了。那么如果在该目录下在配置一个application.yml文件呐,

启动结果如下,

可以看到依然是在端口”9090“启动服务。为此得出这样个结论:在相同文件夹下如果有application.properties和application.yml两个文件,那么application.properties文件会覆盖application.yml文件,生效的是application.properties文件。
什么是yml文件
yml是由YAML (YAML Aint Markup Language)编写的文件格式,是一种很直观的数据序列化方式。很简单就是一种新的文件格式,和XML、prperties文件类似。
二、application.properties/.yml文件可以在其他路径吗
看到这个标题的小伙伴肯定会说,难道application.properties可以在其他路径,没错,猜对了。application.properties/.yml我们是放在了main/resources文件夹下,在项目运行的时候该文件夹下的文件会被拷贝到classes文件夹下,所以该路径又叫做classpath。
在springboot的源码中搜索”application.properties“,搜到ConfigFileApplicationListener这样一个类,在该类的注释上有下面这段话,
* {@link EnvironmentPostProcessor} that configures the context environment by loading
* properties from well known file locations. By default properties will be loaded from
* 'application.properties' and/or 'application.yml' files in the following locations:
* <ul>
* <li>file:./config/</li>
* <li>file:./config/{@literal *}/</li>
* <li>file:./</li>
* <li>classpath:config/</li>
* <li>classpath:</li>
* </ul>
大体意思是”EnvironmentPostProcessor通过从众所周知的文件路径加载properties来配置上下文环境。默认的properties来自application.properties/application.yml文件,这些文件来自以下路径“,
file:./config/ 根文件夹(项目文件夹)下的config目录
file:./config/{@literal *}/ 根文件文件夹(项目文件夹)下的config/*/目录
file:./ 根文件文件夹(项目文件夹)下
classpath:config/ classpath下的config/
classpath: classpath下
好了,我们已经知道了application.properties/application.yml文件会从以上的几个位置加载,且我们配置的main/resources其实就是上面的classpath:,那么上面的这些路径是不是也有先后顺序呐,顺着ConfigFileApplicationListener这个类继续往下看,看到了下面的这样一个属性,
// 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/";
可以看到这个DEFAULT_SEARCH_LOCATIONS 指定的就是上面的几个值,且上面的注释很有意思,但是我没翻译好,通过例子来验证吧。已经知道了application.properties和application.yml的优先级,我们就用application.properties文件来验证就好了,在resources/config(classpath:/config/)下有application.properties,

看下现在使用的是哪个端口,

使用的是9092,也就说resouces/config的优先级大于resources,即,classpath:/config/>classpath:/。下面再看下file:/

在项目的根路径下新建了application.properties文件,起server.port为9093,下面看服务使用的哪个端口,

服务使用的是9093,优先级为:file:/>classpath:/config/>classpath:/。现在我在项目的路径下增加config/my/路径,且增加application.properties文件,

测试结果如下,

服务在端口”9094“启动,说明优先级为:file:./config/*/>file:./>classpath:/>classpath:/config/,最后一个验证的点为file:/config,这个我想无须验证了肯定优先级是最高的,为此优先级顺序由高到低为:file:./config/ > file:./config/*/ > file:./ > classpath:/ > classpath:/config/,通俗点说就是项目根路径下的config>项目根路径下的config/*/>项目根路径>classpath:/config>classpath:/
三、总结
本文主要分析了springboot的默认配置文件application.properties和application.yml的优先级,以及springboot默认的加载路径及每个路径的优先级;
1、同级下,application.properties文件优先级大于application.yml,前者会覆盖后者;
2、springboot的默认加载路径有5个,分别是classpath:/、classpath:/config/、项目根路径、项目根路径/config/*/、项目根路径/config/,会从这5个路径下加载application.properties或application.yml;
3、5个默认的加载路径的优先级为:项目根路径下的config>项目根路径下的config/*/>项目根路径>classpath:/config>classpath:/,前者会覆盖后者
不知道小伙伴是否有这样的疑惑,我们只能使用默认的配置文件吗?只能使用默认的加载路径吗?当然springboot不会这样做,后面继续揭晓,敬请期待。
推荐阅读

application.properties文件中暗藏玄机的更多相关文章
- SpringBoot连接Oracle报错,找不到驱动类,application.properties文件中驱动类路径为红色
pom.xml文件: <!-- oracle odbc --> <dependency> <groupId>com.oracle</groupId> & ...
- Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。
Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.
- SpringBoot读取application.properties文件
http://blog.csdn.net/cloume/article/details/52538626 Spring Boot中使用自定义的properties Spring Boot的applic ...
- Spring系列之——springboot解析resources.application.properties文件
摘要:本文通过讲解如何解析application.properties属性,介绍了几个注解的运用@Value @ConfigurationProperties @EnableConfiguration ...
- application.properties文件常用配置
项目一直在用properties文件写配置,因为配置不是自己来写所以也从来没有研究过各个配置的含义,所以对很多配置也是一知半解,只是知道可以这样用,但是不知道为什么能这样用.自己抽空找了一下资料做个记 ...
- springboot使用@Value注入properties文件中的值,中文乱码
最近开发一个需求,讲一个中文值配置在properties文件中,然后代码中使用@Value注解进行注入使用,然而出现了如下状况: 中文出现乱码,将代码修改如下: String str = new St ...
- SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码
问题: 后台在springMVC中使用hibernate-validator做参数校验的时候(validator具体使用方法见GOOGLE),用properties文件配置了校验失败的错误信息.发现回 ...
- Eclipse下SpringBoot没有自动加载application.properties文件
Eclipse内创建SpringBoot项目,在java/main/resources文件夹下面创建application.properties配置文件,SpringApplication.run后发 ...
- 封装的方法--读取任何路径下的properties文件中的值
概述:我们在做项目时,经常需要从某个properties文件中读取properties文件中的值.现在我封装了一下方法,直接读取配置文件中的值. 代码如下所示: /** * Created by qi ...
随机推荐
- javascript回调地狱真的只能Promise来解决吗?js回调地狱,Promise。
javascript的灵活在于函数可以当作函数的参数来传递,以及它的异步回调思想.但是这就带了一个很严重的问题,那就是回调次数过多,会影响代码结构,多层嵌套影响代码的可阅读性,也不便于书写. 举个例子 ...
- Python入门-内置对象函数
1.callable() 查看函数知否可调用,可调用返回True,不可用返回False print("input函数:", callable(input)) #input函数: T ...
- matplotlib---Annotation标注
import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 50) y = 2 * x + 1 plt.figu ...
- redis集群在线迁移第一篇(数据在线迁移至新集群)实战一
迁移背景:1.原来redis集群在A机房,需要把其迁移到新机房B上来.2.保证现有环境稳定.3.采用在线迁移方式,因为原有redis集群内有大量数据.4.如果是一个全新的redis集群搭建会简单很多. ...
- kubectl get node -n wide --show-labels
集群环境:1.k8s用的是二进制方式安装2.操作系统是linux (centos)3.操作系统版本为 7.4/7.94.k8s的应用管理.node管理.pod管理等用rancher.k8s令牌以及ma ...
- redis 指定db库导入导出数据
最近根据之前的项目重新改编一个新的项目,发现上一个项目的搭建者,把一些区域权限和划分放在redis上存储,因此不得不照搬过来,所以搜索一下相关如何做的 发现一个比较简单的做法,记录一下操作过程,方便以 ...
- JavaWeb学习day5-Servlet初学
- 原生js 复选框全选案例
注 : 本文章主要写功能 代码示例 : <body> <input type="checkbox" id="che" /><br& ...
- python代码统计核酸检测结果截图
#QQ:502440275@qq.com#本截图适合安康码截图,如需其他地区截图统计,可与我QQ或QQ邮箱联系#1.在当前文件夹下创建imgs文件夹用于存放图片,图片格式.jpg#2.在当前文件夹下创 ...
- Python学习笔记: pip install 常见错误汇总
本机环境RHEL8, Python3.9 pip install: 无法安装最新版本的包 在pypi上查看pkg的页面,因为有些pip包的版本对特定的python版本有要求 pip install e ...