Spring Boot项目的配置文件有哪些?加载优先级谁最高?配置优先级谁最高?
目录
一. 结论
二. .prperties、.yml、.yaml 文件类型简介及注意点
2.1 文件简介
2.2. .prperties(默认格式/传统格式)
2.3 application.yml(主流格式)
2.4 application.yaml(主流格式)
2.5 配置文件注意事项
三. bootstrap.properties、bootstrap.yml、bootstrap.yaml 文件
四. 特殊配置文件 application-{profile}.properties、application-{profile}.properties
一. 结论
结论一:spring boot项目中共有三大类配置文件(也可以说是两大类)
第一类:以 properties 结尾的配置文件,例如 bootstrap.properties、bootstrap.properties;
第二类:以 yml 结尾的配置文件,例如 bootstrap.application、application.yml;
第三类:以 yaml 结尾的配置文件,例如 bootstrap.application、application.yaml;
其实,yml文件和yaml文件没有本质区别,它们都是(YAML Ain't Markup Language)格式的一种文件扩展名的缩写,只是有些人习惯写成 .yml 后缀,而有些人习惯写成 .yaml 后缀,而且,在一个项目中,几乎很少会有 yml 文件和 yaml 文件共存,都是使用同一种,所以我们下面就将它们归于一类。
结论二:bootstrap 文件的加载顺序最高且不会被覆盖
结论三:yaml 文件加载顺序 > yml 文件加载顺序 > properties 文件加载顺序
结论四:"同覆盖,不同加",如果两个或者更多文件配置了同种属性时,属性值会覆盖,加载顺序低的生效;有不同属性时,则会全部生效
例子(1)
一个项目中,配置文件 application.yaml 配置项目端口为8080,application.yml配置端口为8081,application.properties文件配置端口为8082,启动项目后,项目实际运行端口为8082。
文件读取过程就是先读取配置文件 application.yaml ,设置项目端口为8080,
然后读再配置文件 application.yml ,设置项目端口为8081,
最后读取配置文件 application.properties ,设置项目端口为8082,
所以项目实际运行后,运行端口为8082;
例子(2)
再比如,application.yaml 配置 mybatis 框架会略大小写驼峰转换,
application.yml 设置 Redis 地址和端口为127.0.0.1:6389,
application.properties 配置 MySQL 用户名密码为root和123456,
那么最后,这三种配置都会在项目中生效,因为它们不是同属性配置,可以叠加。
二. .prperties、.yml、.yaml 文件类型简介及注意点
2.1 文件简介
Spring Boot 项目最大的优点就是简化了原本 Spring 项目繁重的配置,熟悉Spring Boot项目的小伙伴们应该都听过一句话"约定大于配置",即约定的优先级要高于配置。
在Spring boot项目中,我们做配置只需要使用配置文件即可,配置文件主要有 "application.properties"、"application.yml"、"application.yaml"三种文件;
三种文件的优先级为:application.properties > application.yml > application.yaml
通常配置在项目的 resource 文件夹下,正常生效的配置文件,前面会有一个绿色的树叶logo,如果没有,则说明该文件并没有被项目识别为配置文件,里面的配置也是不生效的。
2.2. .prperties(默认格式/传统格式)
properties配置文件格如下所示,格式简单,但是只支持键值对。即 属性值="配置值"。
此外可以看出,properties 文件属性配置是无序的,但有一些属性是需要有先后顺序的,在一些需要路径匹配的配置中,顺序就显得尤为重要。开发人员很有可能会不小心出现属性顺序配置错误的失误。
因此,就有了我们现在最为常用的主流模式 yml/yaml文件。
2.3 application.yml(主流格式)
如下图,可以看出,在 yml 文件中,属性的配置层级非常明显,简单清晰,并且消除了properties文件中需要配置属性前缀造成的冗余,简洁美观。
例如:spring 和 mybatis 是同一级别的,所以二者就隔绝开;
而 datasource 则是在 spring 的下一级,直接在 datasource 后面敲回车换行配置子属性;
而 datasource 下还有用户名和密码等子属性,再敲回车换行配置这样就防止了开发人员在配置属性顺序是的失误。可读性强,冗余小,是现在极为主流的配置文件;
2.4 application.yaml(主流格式)
和 yml 文件一样,只不过由于各程序猿或者架构师习惯写成 yaml 后缀,语法和 yml 文件完全一样,用法也一样,一般在项目中很少同时出现 yml 和 yaml ,都是使用其中一种后缀名的文件;
如果同时出现,yaml 的读取优先级要高于 ,项目启动时,会先读取 yaml 配置文件,再读取 yml 配置文件。
2.5 配置文件注意事项
(1)在使用 properties 配置文件时,要注意有些属性配置顺序有先后要求;
(2)在使用 yml/yaml 配置文件时,要注意给属性配置属性值时前要空一个空格,如下图所示,黄色划线区域其实都是有一个空格的,如果没有空格会报错;
(3)有些版本的 spring boot 在识别 properties 或 yml/yaml 配置文件时,不允许里面包含注解,如果有注解或解析失败,小伙伴们要注意一下哦!!!
三. bootstrap.properties、bootstrap.yml、bootstrap.yaml 文件
上面这三种文件,可以说是所有配置文件中加载优先级最高的文件了,项目在启动初期会最优先加载此文件,里面通常都是一些项目的通用配置,例如微服务中的服务注册中心和配置中心,公用Redis服务器IP端口,服务器网关各种设置等等。
在 bootstrap 文件中配置过的属性,由于都是项目的通用属性设置,所以在各个微服务子模块中,通常就不会再去做配置,即使做了配置,也不会生效。
总之记住一句话:"bootstrap文件最优先加载,且配置属性不会被后加载的文件属性覆盖,优先级极高"。
四. 特殊配置文件 application-{profile}.properties、application-{profile}.properties
在一些大型项目中,或者我们进行公司接触真正的项目之后,通常会发现一个项目中除了上面的集中文件外,还会出现 application-dev.properties,application-prod.properties,application-dev.yml,application-prod.yml 等文件;
如下图所示
这种文件的读取顺序比是相对来说最低的一层。
简单来说,一个项目,有研发阶段,测试阶段,生产阶段,每个阶段的配置文件肯定多多少偏少都是有一点不同的,比如服务器地址,端口等... 那么我们该如何进行丝滑的切换呢?就是通过在 application.properties 或 application.yml 文件中进行设置,二者均可设置。
在 yml 文件中,如下图所示,设置 spring 子属性 profiles 值 active为 local,那么项目在加载完 application.yml 文件之后,就会再去加载 application-local.yml 文件;
在 application.properties 文件中也是一样的,通过键值对的方式即可,
spring.profiles.active=local,即可在项目读取 application.properties 文件后,再去读取 application-local。properties 配置文件
就是通过这些带有 "-dev"(开发使用的配置文件)、"-prod"(项目发布生产的配置文件)以及其它公司内部的各种环境。