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环境属性来切换到另一个文件名。

shell 复制代码
# myproject.properties/yaml
java -jar myproject.jar --spring.config.name=myproject
1.3spring.config.location

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

shell 复制代码
# 若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
shell 复制代码
#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 综合案例
shell 复制代码
#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}) 多个配置

java 复制代码
@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属性名不需要完全匹配

@ConfigurationProperties class:
java 复制代码
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;
    }

}

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

相关推荐
Exclusive_Cat1 小时前
SpringMVC参数接收与数据返回详解
spring·mvc
全干engineer2 小时前
Spring Boot 实现主表+明细表 Excel 导出(EasyPOI 实战)
java·spring boot·后端·excel·easypoi·excel导出
a_Dragon12 小时前
Spring Boot多环境开发-Profiles
java·spring boot·后端·intellij-idea
ChinaRainbowSea3 小时前
补充:问题:CORS ,前后端访问跨域问题
java·spring boot·后端·spring
hqxstudying5 小时前
java依赖注入方法
java·spring·log4j·ioc·依赖
春生野草5 小时前
关于SpringMVC的整理
spring
Bug退退退1236 小时前
RabbitMQ 高级特性之重试机制
java·分布式·spring·rabbitmq
全栈凯哥6 小时前
02.SpringBoot常用Utils工具类详解
java·spring boot·后端
hello早上好7 小时前
CGLIB代理核心原理
java·spring
RainbowSea9 小时前
跨域问题(Allow CORS)解决(3 种方法)
java·spring boot·后端