springboot默认的5种加载路径详解

 更新时间:2022年05月29日 08:10:46   作者:北漂程序员  
这篇文章主要给大家介绍了关于springboot默认的5种加载路径,文中通过示例代码介绍的非常详细,对大家学习或者使用springboot具有一定的参考学习价值,需要的朋友可以参考下

前言

上次分享了如何一步一步搭建一个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不会这样做,后面继续揭晓,敬请期待。

到此这篇关于springboot默认的5种加载路径的文章就介绍到这了,更多相关springboot默认加载路径内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java中的main方法调用非静态方法处理

    Java中的main方法调用非静态方法处理

    这篇文章主要介绍了Java中的main方法调用非静态方法处理,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-06-06
  • Spring Cloud Gateway调用Feign异步问题记录

    Spring Cloud Gateway调用Feign异步问题记录

    这篇文章主要介绍了Spring Cloud Gateway调用Feign异步问题记录,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04
  • WebService教程详解(一)

    WebService教程详解(一)

    WebService,顾名思义就是基于Web的服务。它使用Web(HTTP)方式,接收和响应外部系统的某种请求,接下来通过本文给大家介绍WebService教程详解(一),对webservice教程感兴趣的朋友一起学习吧
    2016-03-03
  • 使用Java实现Redis限流的方法

    使用Java实现Redis限流的方法

    限流的作用是防止某个段时间段内的请求数过多,造成模块因高并发而不可用。这篇文章给大家介绍使用Java实现Redis限流的相关知识,一起看看吧
    2021-09-09
  • 一篇文章超详细的介绍Java继承

    一篇文章超详细的介绍Java继承

    Java中的继承是一种机制,表示为一个对象获取父对象的所有属性和行为,下面这篇文章主要给大家介绍了关于Java继承的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • Java Thread.currentThread().getName() 和 this.getName()区别详解

    Java Thread.currentThread().getName() 和 this.getName()区别详

    本文主要介绍了Thread.currentThread().getName() 和 this.getName()区别详解,TestThread testThread = new TestThread();
    2022-02-02
  • Springboot+WebSocket+Netty实现在线聊天/群聊系统

    Springboot+WebSocket+Netty实现在线聊天/群聊系统

    这篇文章主要实现在好友添加、建群、聊天对话、群聊功能,使用Java作为后端语言进行支持,界面友好,开发简单,文章中有详细的代码示例供大家参考,需要的朋友可以参考下
    2023-08-08
  • Java使用策略模式实现聚石塔接口调用的问题

    Java使用策略模式实现聚石塔接口调用的问题

    这篇文章主要介绍了Java使用策略模式实现聚石塔接口调用,为了避免多重判断,而且有更好的扩展性,首选了策略模式来实现,具体解决方法跟随小编一起看看吧
    2021-12-12
  • Spring Boot读取自定义配置文件

    Spring Boot读取自定义配置文件

    在Spring Boot项目中我们经常需要读取application.yml配置文件的自定义配置,今天就来罗列一下从yaml读取配置文件的一些常用手段和方法。
    2021-05-05
  • Spring MVC  接受请求参数的方法

    Spring MVC  接受请求参数的方法

    了解HTTP请求的GET和POST方法中如何携带参数,以及SpringMVC中如何接收这些参数,GET方法通过URL传递参数,而POST方法通常在请求体中传递,SpringMVC使用注解如@RequestParam和@RequestBody来绑定参数到控制器方法
    2024-09-09

最新评论