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

推荐阅读

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

application.properties文件中暗藏玄机的更多相关文章

  1. SpringBoot连接Oracle报错,找不到驱动类,application.properties文件中驱动类路径为红色

    pom.xml文件: <!-- oracle odbc --> <dependency> <groupId>com.oracle</groupId> & ...

  2. Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可。

    Spring Boot为我们准备了最佳的数据库连接池方案,只需要在属性文件(例如application.properties)中配置需要的连接池参数即可.

  3. SpringBoot读取application.properties文件

    http://blog.csdn.net/cloume/article/details/52538626 Spring Boot中使用自定义的properties Spring Boot的applic ...

  4. Spring系列之——springboot解析resources.application.properties文件

    摘要:本文通过讲解如何解析application.properties属性,介绍了几个注解的运用@Value @ConfigurationProperties @EnableConfiguration ...

  5. application.properties文件常用配置

    项目一直在用properties文件写配置,因为配置不是自己来写所以也从来没有研究过各个配置的含义,所以对很多配置也是一知半解,只是知道可以这样用,但是不知道为什么能这样用.自己抽空找了一下资料做个记 ...

  6. springboot使用@Value注入properties文件中的值,中文乱码

    最近开发一个需求,讲一个中文值配置在properties文件中,然后代码中使用@Value注解进行注入使用,然而出现了如下状况: 中文出现乱码,将代码修改如下: String str = new St ...

  7. SpringMVC+HibernateValidator,配置在properties文件中的错误信息回显前端页面出现中文乱码

    问题: 后台在springMVC中使用hibernate-validator做参数校验的时候(validator具体使用方法见GOOGLE),用properties文件配置了校验失败的错误信息.发现回 ...

  8. Eclipse下SpringBoot没有自动加载application.properties文件

    Eclipse内创建SpringBoot项目,在java/main/resources文件夹下面创建application.properties配置文件,SpringApplication.run后发 ...

  9. 封装的方法--读取任何路径下的properties文件中的值

    概述:我们在做项目时,经常需要从某个properties文件中读取properties文件中的值.现在我封装了一下方法,直接读取配置文件中的值. 代码如下所示: /** * Created by qi ...

随机推荐

  1. 纹理集打包和动画转换工具Texture Merge的使用教程

    Texture Merger 可将零散纹理拼合为整图,同时也可以解析SWF.GIF动画,制作Egret位图文本,导出可供Egret使用的配置文件,其纹理集制作功能在小游戏开发中可以起到降低小游戏包体的 ...

  2. 基于Vue+Vuex+iView的电子商城网站

    MALL-VUE 这是一个基于VUE + VUEX + iView做的一个电商网站前端项目, 附带前后端分离实现版本(在forMallServer分支),欢迎fork或star 项目地址: https ...

  3. 前端面试题整理——手写bind函数

    var arr = [1,2,3,4,5] console.log(arr.slice(1,4)) console.log(arr) Function.prototype.bind1 = functi ...

  4. APK安装流程概述

    pre { background: none left top repeat scroll rgba(0, 0, 0, 0); border: 1px solid rgba(0, 0, 0, 1); ...

  5. C语言---魔方阵

    魔方阵的定义:在n*n的方阵中,每一行的和=每一列的和=对角线的和.(本文中涉及的n为大于3的奇数). 例如3*3的魔方阵为: 5*5的魔方阵为: 如何写魔方阵呢? 1.数字1位于第一行的正中间2.下 ...

  6. matplotlib---legend图例

    import numpy as np import matplotlib.pyplot as plt x = np.linspace(-3, 3, 50) y1 = 2 * x + 1 y2 = x ...

  7. 实现WebMvcConfigurer接口扩展Spring MVC的功能

    前言: 先查看WebMvcConfigurer接口中都定义了哪些内容 public interface WebMvcConfigurer { default void configurePathMat ...

  8. PowerBI添加中国地图

    可以直接在添加视觉对象中添加 或者用此方法 样子: 添加形状地图地图的"位置""图例" 然后去http://datav.aliyun.com/portal/sc ...

  9. 硬件vendor id查询对照列表

    Hex-ID Vendor Name003D Lockheed Martin Corp0E11 Compaq1000 Symbios Logic Inc.1001 KOLTER ELECTRONIC1 ...

  10. 『现学现忘』Git基础 — 2、Git和SVN的区别

    1.Git和SVN的区别 (1)SVN(集中式版本管理系统) 集中式的版本控制系统都有一个单一的集中管理的服务器,保存所有文件的修订版本,而协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者 ...