4

springboot竟然有5种默认的加载路径,你未必都知道 - 北漂程序员

 2 years ago
source link: https://www.cnblogs.com/teach/p/16320499.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

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

一、application.properties/.yml文件初识

前面说到没有配置application.properties文件,现在我在main/resources文件夹下新建一个application.properties文件,并且写上如下的配置

985599-20220528120020045-1514428536.png

然后,启动项目,

985599-20220528120408787-242842562.png

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

985599-20220528120601341-2037085598.png

启动结果如下,

985599-20220528120733088-461746286.png

可以看到依然是在端口”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,

985599-20220528164613740-1911815774.png

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

985599-20220528164713791-757400735.png

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

985599-20220528170308426-144094557.png

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

985599-20220528170450101-1813578906.png

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

985599-20220528175246328-736320149.png

测试结果如下,

985599-20220528172133500-127160699.png

服务在端口”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不会这样做,后面继续揭晓,敬请期待。

推荐阅读

5分钟快速搭建一个springboot的项目

985599-20220528173334203-157055796.jpg

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK