springboot-配置文件优先级

官方文档 https://docs.spring.io/spring-boot/docs/2.7.16/reference/htmlsingle/#features.external-config

Spring Boot允许外部化配置,这样就可以在不同的环境中使用相同的应用程序代码。您可以使用各种外部配置源,包括Java属性文件、YAML文件、环境变量和命令行参数

属性值可以使用@Value注解直接注入到bean中,通过Spring的环境抽象访问,也可以通过@ConfigurationProperties绑定到结构化对象

外部配置优先级

Spring Boot使用了一个非常特殊的PropertySource顺序,旨在允许合理的值覆盖。后面的属性源可以覆盖前面定义的值。来源按以下顺序考虑(优先级从小到大):

  1. Default properties (specified by setting SpringApplication.setDefaultProperties).
  2. @PropertySource annotations on your @Configuration classes.
    • 请注意,在刷新应用程序上下文之前,此类属性源不会添加到环境中。
    • 这对于logging.* spring.main.*在刷新开始之前就要set的配置来说:太晚了
  3. Config data (such as application.properties files).
  4. A RandomValuePropertySource that has properties only in random.*.
  5. OS environment variables.
  6. Java System properties (System.getProperties()). ; VM options,使用java -Dage=18
  7. JNDI attributes from java:comp/env.
  8. ServletContext init parameters.
  9. ServletConfig init parameters.
  10. Properties from SPRING_APPLICATION_JSON (inline JSON embedded in an environment variable or system property).
  11. Command line arguments.
  12. properties attribute on your tests. Available on @SpringBootTest and the test annotations for testing a particular slice of your application.
  13. @DynamicPropertySource annotations in your tests.
  14. @TestPropertySource annotations on your tests.
  15. Devtools global settings properties in the $HOME/.config/spring-boot directory when devtools is active.

在这里插入图片描述
最终转换的执行命令: java -Dage=22 -classpath **.jar cn.jhs.spring.boot.App --name=joe
执行结果name=joe,age=22,sex=M

Application Properties优先级

https://docs.spring.io/spring-boot/docs/2.7.16/reference/htmlsingle/#features.external-config.files

springboot默认会加载application.yaml或application.properties中的配置信息.
!!!注意: 同名文件,".properties"优先级大于".yaml"

1.application.properties and YAML

1.1 优先级

在这里插入图片描述

案例说明:
在这里插入图片描述

1.2 spring.config.name

如果你不喜欢用application作为配置文件名,可以通过指定spring.config.name环境属性来切换到另一个文件名。

# myproject.properties/yaml
java -jar myproject.jar --spring.config.name=myproject
1.3spring.config.location

还可以使用spring.config.location环境属性来引用显式位置。此属性接受一个逗号分隔的列表,其中包含要检查的一个或多个位置。

# 若default.properties与override.properties存在同名的配置,后面的会覆盖前面的; **last-wins**策略
$ java -jar myproject.jar --spring.config.location=\
    optional:classpath:/default.properties,\
    optional:classpath:/override.properties
1.4 spring.config.additional-location
#1. 设置 spring.config.additional-location
spring.config.additional-location=optional:classpath:/custom-config/,optional:file:./custom-config/

#2.优先级(优先级从小到大,后面覆盖前面)
## additional-location高于spring.config.location优先级
optional:classpath:/;optional:classpath:/config/
optional:file:./;optional:file:./config/;optional:file:./config/*/
optional:classpath:custom-config/
optional:file:./custom-config/

2.application-{profile}.properties and YAML

https://docs.spring.io/spring-boot/docs/2.7.16/reference/htmlsingle/#features.external-config.files.profile-specific

Spring Boot还会尝试使用命名约定application-{profile}来加载特定于profile的文件。例如,如果您的应用程序激活一个名为prod的配置文件,那么application.yaml 和 application-prod.yaml 都会被使用。

特定于profile的文件总是覆盖非特定的配置。
如果指定了多个profile,则采用last-wins策略。例如,如果spring.profiles.active设置为prod,live由属性指定,值在application-prod.properties属性可以被application-live.properties中的属性覆盖。

2.1 last-win 综合案例
#1. profiles : prod,live

#2. 存在配置文件
/cfg
  application-live.properties
/ext
  application-live.properties
  application-prod.properties

# 3.1 若 spring.config.location=classpath:/cfg/,classpath:/ext/ ,优先级(后面的覆盖前面)
# /cfg 总是会被 /ext 覆盖
/cfg/application-live.properties
/ext/application-prod.properties
/ext/application-live.properties

# 3.2 若 spring.config.location=classpath:/cfg/;classpath:/ext/    (注意是; 不是,)
# # /cfg 和/ext 优先级一致
/ext/application-prod.properties
/cfg/application-live.properties
/ext/application-live.properties

3. jar包外的 application.properties and YAML

4 jar包外的application-{profile}.properties and YAML



其它

yaml分隔符

yaml可以使用---分割不同的配置块,当spring.profiles.active=dev时,配置文件优先级:
在这里插入图片描述
此时的environment.getPropertySources().propertySourceList
在这里插入图片描述

@PropertySource(value={xx,yy}) 多个配置

@Component
@ConfigurationProperties(prefix = "my.cache")
//注意:默认仅支持 *.properties
@PropertySource(value = {"classpath:cache.properties","file:./config/cache.properties"}, ignoreResourceNotFound = true)
public class CacheConfigProperties {
    private String name;
    private long timeout;
}

这里@PropertySource引入的资源,跟code顺序无关, 同样按照 file > classpath的优先级来加载。

所以我们可以在project中填写默认的配置。
部署服务器时,在file目录下,填写实际的配置。

宽松的绑定规则

https://docs.spring.io/spring-boot/docs/2.7.16/reference/htmlsingle/#features.external-config.typesafe-configuration-properties.relaxed-binding

Spring Boot使用了一些宽松的规则将环境属性绑定到@ConfigurationProperties bean上,因此环境属性名和bean属性名不需要完全匹配

不支持@Value(), @Value必须严格的匹配

@ConfigurationProperties class:
import org.springframework.boot.context.properties.ConfigurationProperties;

@ConfigurationProperties(prefix = "my.main-project.person")
public class MyPersonProperties {

    private String firstName;

    public String getFirstName() {
        return this.firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

}

在上述代码中,可以使用下列属性名)

propertyNode
my.main-project.person.first-name -.properties and YAML 使用
my.main-project.person.firstName 标准的驼峰标识.
my.main-project.person.first_name _.properties and YAML 使用
MY_MAINPROJECT_PERSON_FIRSTNAME 大写格式,仅在system environment variables 才有效

注解前缀必须都是小写字符或者用-分隔
优先级:大写格式 > ‘-’ > '_' > 驼峰
测试

#1. 结果为first-name
MY_MAINPROJECT_PERSON_FIRSTNAME: MY_MAINPROJECT_PERSON_FIRSTNAME
my:
  main-project:
    person:
      firstName: firstName
      first_name: first_name
      first-name: first-name

#2. 结果为 firstName
MY_MAINPROJECT_PERSON_FIRSTNAME: MY_MAINPROJECT_PERSON_FIRSTNAME
my:
  main-project:
    person:
      firstName: firstName
      first_name: first_name
#      first-name: first-name

#3.结果为 first_name
MY_MAINPROJECT_PERSON_FIRSTNAME: MY_MAINPROJECT_PERSON_FIRSTNAME
my:
  main-project:
    person:
#      firstName: firstName
       first_name: first_name
#      first-name: first-name

#4.结果为 --- 报错null (说明该方式只支持在system environment)
MY_MAINPROJECT_PERSON_FIRSTNAME: MY_MAINPROJECT_PERSON_FIRSTNAME
my:
  main-project:
    person:
#      firstName: firstName
#       first_name: first_name
#      first-name: first-name

#5. 结果为:MY_MAINPROJECT_PERSON_FIRSTNAME
## 5.1 system environment
MY_MAINPROJECT_PERSON_FIRSTNAME=MY_MAINPROJECT_PERSON_FIRSTNAME
## 5.2 properties文件
my:
  main-project:
    person:
      firstName: firstName
      first_name: first_name
      first-name: first-name
@ConfigurationProperties vs. @Value

在这里插入图片描述

  1. Relaxed binding
    • @Value("${demo.item-price}")
      • 可以使用 application.properties文件中的demo.item-pricedemo.itemPrice
      • 以及系统变量中的DEMO_ITEMPRICE
    • @Value("${demo.itemPrice}"): 无法使用 demo.item-priceDEMO_ITEMPRICE
    • 结论: @Value推荐使用aa-bb-cc格式配置
  2. Meta-data support

Configuration metadata files位于META-INF/spring-configuration-metadata.json下的jar包中。它们使用JSON格式,将项目分类为“groups”或“properties”,其他值分类为“hints”,如下面的例子所示:
通过如下配置,会告诉你如下属性在哪里被使用。在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Spring Boot 配置文件优先级如下: 1. 在命令行中使用 --spring.config.name 和 --spring.config.location 参数指定的配置文件。 2. 在项目根目录下的 config 子目录中的 application.properties 或 application.yml 文件。 3. 在项目根目录下的 application.properties 或 application.yml 文件。 4. 在 classpath 下的 config 目录中的 application.properties 或 application.yml 文件。 5. 在 classpath 下的 application.properties 或 application.yml 文件。 优先级从高到低,如果同一个配置在多个文件中都存在,那么优先级高的会覆盖优先级低的。 ### 回答2: SpringBoot 是一种全新的框架,它通过自动配置(auto-configuration)和约定大于配置(convention over configuration)的方式,提供了开箱即用的开发体验。其中,配置文件优先级SpringBoot 开发中的一个重要问题。 SpringBoot 支持多种不同类型的配置文件,包括 properties、yml、yaml、json 等。在使用不同类型的配置文件时,SpringBoot 会为不同的配置文件设置不同的优先级,如下所示: 1. DevTools 全局设置文件优先级最高。SpringBoot在启动时会首先加载 DevTools 全局设置文件 application.properties 和 application.yml,并且该配置文件不会受到其他配置文件的影响。 2. 测试配置文件优先级高于主配置文件。如果在测试环境中使用不同的配置文件,那么 SpringBoot 会先加载测试环境的配置文件 application-test.properties 或者 application-test.yml,然后再加载主配置文件 application.properties 或者 application.yml。 3. 命令行参数的优先级高于配置文件。如果在启动应用程序时指定了命令行参数,那么 SpringBoot 会使用命令行参数中的配置覆盖通过配置文件中相同的配置。 4. 应用程序内部的配置文件优先级低于外部配置文件。如果同一目录下有多个同名的配置文件,那么 SpringBoot 会优先加载外部配置文件,然后再加载内部配置文件。 5. 不同类型的配置文件优先级依次递减。在 SpringBoot 中,yml 文件的优先级高于 properties 文件。如果同时存在 application.properties 和 application.yml 两种配置文件,那么 SpringBoot 会优先加载 application.yml 文件。 6. 默认配置文件不可替换。SpringBoot 在启动时会自动搜索默认配置文件 application.properties 或者 application.yml,如果存在就会加载,且不可替换。 以上是 SpringBoot 配置文件优先级,不同的配置文件具有不同的优先级,在实际开发中,需要根据不同的需求选择不同的配置文件,并合理配置其优先级,才能更好地发挥 SpringBoot 的自动配置和约定大于配置的特性。 ### 回答3: Spring Boot是一个全功能框架,可以通过各种方式为我们的应用程序提供配置。在项目中,可以使用各种文件作为配置文件。对于不同的配置文件Spring Boot有不同的优先级,如下所述。 1、项目默认配置 Spring Boot会在classpath下面查找一个名为application.properties或application.yml的文件,使用其中的配置作为项目的默认配置。这个文件夹应该在项目的src/main/resources目录下。 2、特定的配置文件 可以使用spring.config.name和spring.config.location来指定想要覆盖的配置文件的名称和路径,例如: spring.config.name=myConfigFile spring.config.location=file:/etc/myApp/ 在这个例子中,Spring Boot将会在/etc/myApp/下查找一个名为myConfigFile的文件作为特定配置文件。 3、Profile-specific配置文件 Spring Boot允许为每个Profile定义独立的配置文件。可以使用spring.profiles.active属性来确定当前正在使用的Profile。例如,可以在application.properties或application.yml中定义: spring.profiles.active=dev 这就意味着我们需要创建一个名为application-dev.properties或application-dev.yml的文件,在其中定义适用于dev环境的配置。 4、命令行参数 在命令行中指定的参数可以覆盖任何其他配置。例如,使用以下命令运行应用程序: java -jar myApp.jar --myProperty=myValue 在这个例子中,Spring Boot将使用“myValue”替换使用application.properties或application.yml中定义的myProperty的值。 5、环境变量 Spring Boot还支持使用环境变量来配置应用程序。例如,如果在环境变量中定义了“SPRING_APP_NAME”,您可以在应用程序中使用该变量,如下所示: @Value("${SPRING_APP_NAME}") private String appName; 如果在环境变量和配置文件中都找不到变量,则Spring Boot将使用默认值。 结论 Spring Boot提供了多种自定义配置的方式。这个框架允许开发人员根据业务需求使用不同的配置文件和配置方式。如果多个配置文件有冲突,Spring Boot将按照上述优先级使用这些配置。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值