Java OpenResty Spring Spring Boot MySQL Redis MongoDB PostgreSQL Linux Android Nginx 面试 小程序 Arthas JVM AQS juc Kubernetes Docker 诊断工具


Spring Boot 设置 application.yaml application.properties 配置文件读取路径

Spring Boot 大约 2961 字

描述

Spring Boot可以从jar包中获取配置文件,也可以从外部获取配置文件。

配置文件覆盖策略

last-wins strategy最后添加的覆盖先前添加的策略。

配置文件优先级

优先级从高到低

  • ./config/*/:工程目录下的config文件夹中的一级子文件夹中的配置文件。
  • ./config/:工程目录下的config文件夹中的配置文件。
  • ./:工程目录下的配置文件。
  • classpath:/config/resources目录下的config文件夹下的配置文件(注意:此处不适用一级子文件夹)。
  • classpath:/resources目录下的配置文件。
├── application.yaml
├── config
│         └── application.yaml
├── src
│         └── main
│             ├── java
│             │         └── com
│             │             └── example
│             └── resources
│                 ├── application-prod.yaml
│                 ├── application-test.yaml
│                 ├── application.yaml
│                 └── config
│                     └── application.yaml

指定配置文件

使用spring.config.location指定配置文件的位置。

spring:
  config:
    location: file:${user.dir}/myconf/

optional:表示可选的,即没有这个路径也不会报错,而是读取默认路径下的配置。

spring:
  config:
    location: optional:file:${user.dir}/myconf/

, ; 区别

在使用指定配置文件时使用,;区别如下,如激活的配置是active=prod,live

, 逗号

示例

spring:
  config:
    location: classpath:/cfg/,classpath:/ext/

读取顺序:先读取cfg文件夹中的配置,再读取ext文件夹的配置(文件夹读取按字母表顺序)。

这样ext中的live配置会覆盖cfg中的配置。

/cfg/application-live.properties

/ext/application-prod.properties

/ext/application-live.properties

; 封号

示例

spring:
  config:
    location: classpath:/cfg/;classpath:/ext/

读取顺序:同时读取两个文件夹中的配置,再按激活顺序排序。

/ext/application-prod.properties

/cfg/application-live.properties

/ext/application-live.properties

导入配置

配置了import配置文件会被导入的配置文件中的属性覆盖。

即:导入的dev.properties配置会覆盖默认的application.properties配置。

spring:
  config:
    import: "optional:file:./dev.properties"

导入无后缀的配置

需使用[.type]指定文件类型,如[.yaml]告诉Springmyconfig文件是yaml格式。

spring:
  config:
    import: "file:/etc/config/myconfig[.yaml]"

ConfigMap 和 Secret

可以使用configtree配置KubernetesConfigMapSecret,但是需要挂载到指定路径,直接使用环境变量引入无效。

spring:
  config:
    import: "optional:configtree:/etc/config/"

源码

可以看到默认查找路径如下,底下的配置会替换掉上一级的配置。

  • optional:classpath:/
  • optional:classpath:/config/
  • optional:file:./
  • optional:file:./config/
  • optional:file:./config/*/
// org.springframework.boot.context.config.ConfigDataEnvironment
class ConfigDataEnvironment {

    static final String LOCATION_PROPERTY = "spring.config.location";

    static final String ADDITIONAL_LOCATION_PROPERTY = "spring.config.additional-location";

    static final String IMPORT_PROPERTY = "spring.config.import";

    static final String ON_NOT_FOUND_PROPERTY = "spring.config.on-not-found";

    static final ConfigDataLocation[] DEFAULT_SEARCH_LOCATIONS;
    static {
        List<ConfigDataLocation> locations = new ArrayList<>();
        locations.add(ConfigDataLocation.of("optional:classpath:/;optional:classpath:/config/"));
        locations.add(ConfigDataLocation.of("optional:file:./;optional:file:./config/;optional:file:./config/*/"));
        DEFAULT_SEARCH_LOCATIONS = locations.toArray(new ConfigDataLocation[0]);
    }

}

官方文档

https://docs.spring.io/spring-boot/docs/current/reference/html/features.html#features.external-config

阅读 1747 · 发布于 2023-02-07

————        END        ————

Give me a Star, Thanks:)

https://github.com/fendoudebb

扫描下方二维码关注公众号和小程序↓↓↓

扫描二维码关注我
昵称:
随便看看 换一批