从零开始SpringCloud Alibaba实战(73)——springboot配置文件加载顺序,配置文件优先级(最详细配置文件)

前言

SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就可以使用配置文件进行替换配置。
常见的配置文件后缀类型有yml,yaml properties ,前半部分有bootstrap application即常见的配置文件有:bootstrap.yml bootstrap.properties
application.properties或者application.yml(application.yaml)等。

那加载顺序是如何加载的呢?

application与bootstrap文件加载顺序

Spring Cloud 构建于 Spring Boot 之上,在 Spring Boot 中有两种上下文,一种是 bootstrap,另外一种是 application

加载顺序(列举yml类型)

若application.yml 和bootstrap.yml 在同一目录下:bootstrap.yml 先加载 application.yml后加载

bootstrap.yml 用于应用程序上下文的引导阶段。bootstrap.yml 由父Spring ApplicationContext加载。

bootstrap.yml 和 application.yml 都可以用来配置参数。

bootstrap.yml 用来程序引导时执行,应用于更加早期配置信息读取。可以理解成系统级别的一些参数配置,这些参数一般是不会变动的。一旦bootStrap.yml 被加载,则内容不会被覆盖。

application.yml 可以用来定义应用级别的, 应用程序特有配置信息,可以用来配置后续各个模块中需使用的公共参数等。

启动上下文时,Spring Cloud 会创建一个 Bootstrap Context,作为 Spring 应用的 Application Context 的父上下文。

初始化的时候,Bootstrap Context 负责从外部源加载配置属性并解析配置。这两个上下文共享一个从外部获取的 Environment。Bootstrap 属性有高优先级,默认情况下,它们不会被本地配置覆盖。

也就是说如果加载的 application.yml 的内容标签与 bootstrap 的标签一致,application 也不会覆盖 bootstrap,而 application.yml 里面的内容可以动态替换。

bootstrap.yml典型的应用场景
当使用 Spring Cloud Config Server 配置中心时,这时需要在 bootstrap.yml 配置文件中指定 spring.application.name 和 spring.cloud.config.server.git.uri,添加连接到配置中心的配置属性来加载外部配置中心的配置信息
一些固定的不能被覆盖的属性
一些加密/解密的场景

properties,yaml,yml的优先级

当三种文件路径相同时,三个文件中的配置信息都会生效,但是当三个文件中有配置信息冲突时,加载顺序是yml>yaml>properties
这里的逻辑顺序是先加载yml再加载yaml再加properties,后加载的自然会把先加载的数据给覆盖掉.
原因:至于原因可以在spring-boot-starter-parent里找到
在这里插入图片描述

不同位置的配置文件的加载顺序:

在不指定要被加载文件时,默认的加载顺序:由里向外加载,所以最外层的最后被加载,会覆盖里层的属性(参考官网介绍)

SpringApplication will load properties from application.properties files in the following locations and add them to the Spring Environment:

A /config subdirectory of the current directory. //位于与jar包同级目录下的config文件夹,
The current directory //位于与jar包同级目录下
A classpath /config package //idea 环境下,resource文件夹下的config文件夹
The classpath root //idea 环境下,resource文件夹下 (1->4, 外->里)
The list is ordered by precedence (properties defined in locations higher in the list override those defined in lower locations).

服务启动加载指定文件

可以通过属性指定加载某一文件:

java -jar myproject.jar --spring.config.location=classpath:/default.properties,classpath:/override.properties
当通过spring.config.location 指定一个配置文件时,配置文件的搜索顺序如下:

file:./custom-config/
classpath:custom-config/
file:./config/
file:./
classpath:/config/
classpath:/
最下层的优先加载,所以最上层的属性会覆盖下层的属性;

. 如果使用spring-cloud-config时,项目内部的resource下有bootstrap.yml文件,并且在bootstrap.yml 里配置spring.application.name, git.url,spring.active.profies. 将项目打成jar包,放到服务器上,与jar包并列的位置,有start.sh脚本,

a. 在start 脚本里指定了配置文件:spring.config.location=./bootstrap.yml, 则配置文件的加载顺序将为:

  1. cloud-config 仓库里指定的yml 配置;

  2. ./bootstrap.yml

  3. classpath:/bootstrap.yml

  4. 外部application.yml

  5. 内部application.yml

b. 在start 脚本里指定了配置文件:spring.config.location=./application.yml, 则配置文件的加载顺序将为:

  1. cloud-config 仓库里指定的yml 配置;

  2. ./application.yml

  3. classpath:/application.yml

  4. ./bootstrap.yml

  5. classpath:/bootstrap.yml

所以,不管是jar包内还是jar运行的同级目录下,只要包含bootstrap.yml ,且为云配置,则云配置文件会覆盖其他配置文件;

springboot启动会扫描一下位置的application.properties或者application.yml作为默认的配置文件
工程根目录:./config/
工程根目录:./
classpath:/config/
classpath:/
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,高优先级的内容会覆盖底优先级的内容

springboot外部配置加载顺序如下,优先级从高到底,并且高优先级的配置覆盖底优先级的配置形成互补配置

优先加载带profile
jar包外部的application-{profile}.propertie或application.yml(带spring.profile)配置文件

再来加载不带profile
jar包外部的application.propertie或application.yml(不带spring.profile)配置文件

自定义配置文件加载

使用@PropertySource(“classpath:user.properties”)加载配置,同时使用@ConfigurationProperties自动绑定属性,当然也可以使用@Value来注入配置


 
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
 
@Data
@Configuration
@ConfigurationProperties(prefix="user")
@PropertySource("classpath:user.properties")
public class UserConfig {
 
    private String userName;
 
    private String realName;
 
    private Integer mobile;
 
    private String message;
 
    public String getUserName() {
        return userName;
    }
 
    public void setUserName(String userName) {
        this.userName = userName;
    }
 
    public String getRealName() {
        return realName;
    }
 
    public void setRealName(String realName) {
        this.realName = realName;
    }
 
    public Integer getMobile() {
        return mobile;
    }
 
    public void setMobile(Integer mobile) {
        this.mobile = mobile;
    }
 
    public String getMessage() {
        return message;
    }
 
    public void setMessage(String message) {
        this.message = message;
    }
 
    @Override
    public String toString() {
        return "UserConfig [userName=" + userName + ", realName=" + realName + ", mobile=" + mobile + ", message="
                + message + "]";
    }
 
}

这样就可以直接使用user.properties配置文件中的配置,这里有注意事项:

只有@PropertySource,是不能加载配置的。
@ConfigurationProperties(prefix=“user”) 只绑定了user.开头的属性。
@Value 可以注入任何属性。
@ConfigurationProperties和@Value的不同是,@ConfigurationProperties支持属性绑定,@Value不行,但是@Value支持el表达式,@ConfigurationProperties不支持。

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值