SpringBoot配置文件的加载顺序和优先级,到底有啥区别

141 阅读3分钟

加载顺序(Loading Order)

加载顺序指的是配置文件被读取和解析的先后顺序。Spring Boot在启动过程中会按照一定的顺序加载配置文件,确保某些配置在其他配置之前生效。具体顺序如下:

  1. bootstrap文件

    • bootstrap.propertiesbootstrap.yml文件在SpringApplication实例化之前加载。这些文件通常用于配置系统级别的参数,例如配置中心的连接信息、加密密钥等。这些参数需要在应用启动的早期阶段就加载,以确保应用能够正确连接到配置中心等系统级别的服务。
    • 加载顺序:bootstrap.properties > bootstrap.yml
  2. application文件

    • application.propertiesapplication.yml文件在SpringApplication实例化之后加载。这些文件通常用于配置应用级别的参数,例如数据库连接信息、服务端口等。这些参数对应用的运行至关重要,但可以在bootstrap文件加载之后再生效。
    • 加载顺序:application.properties > application.yml

优先级(Priority)

优先级指的是当多个配置文件中存在相同的属性时,哪个属性值最终生效。Spring Boot会根据配置文件的优先级来决定哪个属性值会被使用。具体优先级如下:

  1. 命令行参数

    • 通过命令行传递的参数具有最高优先级,例如java -jar myapp.jar --server.port=8081
  2. Java系统属性

    • 在启动应用时通过-D选项设置的系统属性,例如java -Dserver.port=8081 -jar myapp.jar
  3. 操作系统环境变量

    • 设置在操作系统级别的环境变量,例如SERVER_PORT=8081
  4. 随机数配置属性源

    • 包括random.*属性,用于生成随机数或其他随机相关的配置。
  5. 基于当前激活的Spring Profile加载的配置文件

    • application-{profile}.propertiesapplication-{profile}.yml文件,例如激活了dev环境,则加载application-dev.properties
  6. 默认的配置文件

    • application.propertiesapplication.yml文件,通常位于src/main/resources目录下。
  7. @PropertySource注解指定的属性文件

    • 通过在配置类上使用@PropertySource注解加载的自定义属性文件。
  8. 默认属性

    • 使用SpringApplication.setDefaultProperties设定的默认属性。

相同属性的优先级

对于相同属性,Spring Boot会按照以下优先级顺序处理:

  1. 命令行参数

  2. Java系统属性

  3. 操作系统环境变量

  4. 随机数配置属性源

  5. 基于当前激活的Spring Profile加载的配置文件

  6. 默认的配置文件

    • application.properties > application.yml
  7. @PropertySource注解指定的属性文件

  8. 默认属性

不同属性的加载顺序

对于不同属性,Spring Boot会按照以下加载顺序处理:

  1. bootstrap文件

    • bootstrap.properties > bootstrap.yml
  2. application文件

    • application.properties > application.yml

示例

假设我们有以下配置文件:

  • bootstrap.properties:

    properties复制

    server.port=8080
    spring.cloud.config.uri=http://config-server:8888
    
  • application.properties:

    properties复制

    server.port=8081
    
  • application.yml:

    yaml复制

    server:
      port: 8082
    

属性值的最终生效顺序

  1. 命令行参数:如果通过命令行参数设置了server.port=8083,那么最终生效的将是8083

  2. Java系统属性:如果通过-Dserver.port=8084设置了系统属性,那么最终生效的将是8084

  3. 操作系统环境变量:如果设置了环境变量SERVER_PORT=8085,那么最终生效的将是8085

  4. 随机数配置属性源:如果有随机数配置,优先级较低。

  5. 基于当前激活的Spring Profile加载的配置文件:如果有application-dev.properties,优先级高于默认的application.propertiesapplication.yml

  6. 默认的配置文件

    • application.properties中的server.port=8081会覆盖bootstrap.properties中的server.port=8080
    • application.yml中的server.port=8082会覆盖application.properties中的server.port=8081

总结

  • 加载顺序bootstrap.properties > bootstrap.yml > application.properties > application.yml
  • 优先级:命令行参数 > Java系统属性 > 操作系统环境变量 > 随机数配置属性源 > 基于当前激活的Spring Profile加载的配置文件 > application.properties > application.yml >