MST

星途 面试题库

面试题:Java之Spring Boot中配置文件的加载顺序是怎样的

在Spring Boot项目里,有多种配置文件,如application.properties、application.yml以及针对不同环境的application-{profile}.properties等。请阐述这些配置文件的加载顺序以及原因。
50.2万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试
  1. 加载顺序
    • 优先级从高到低
      • 命令行参数:在启动Spring Boot应用时通过命令行传递的参数,例如java -jar myapp.jar --server.port=8081,这种方式优先级最高。
      • SPRING_APPLICATION_JSON中的属性:可以通过环境变量SPRING_APPLICATION_JSON指定JSON格式的配置,如SPRING_APPLICATION_JSON='{"server.port":8082}'
      • 操作系统环境变量:系统的环境变量,例如SERVER_PORT
      • JVM系统属性(System.getProperties():在启动应用时通过-D参数设置的属性,如java -Dserver.port=8083 -jar myapp.jar
      • RandomValuePropertySource:用于生成随机数的属性源,如random.int等。
      • 应用配置文件
        • application-{profile}.propertiesapplication-{profile}.yml(带特定环境配置的文件):针对不同运行环境(如devprod等)的配置文件,优先加载与当前激活环境匹配的配置文件。
        • application.propertiesapplication.yml:通用的应用配置文件,是整个应用的基础配置。
      • @PropertySource注解加载的属性:通过在Java配置类中使用@PropertySource注解指定的属性文件,优先级低于应用配置文件。
      • 默认属性:Spring Boot内部的默认属性设置。
  2. 原因
    • 灵活性与可定制性:命令行参数优先级最高,是因为它允许运维人员在不修改代码和配置文件的情况下,灵活地调整应用的运行参数,比如修改端口号、数据库连接字符串等,适用于不同的部署环境。
    • 环境特定配置优先application-{profile}.propertiesapplication-{profile}.yml优先于application.propertiesapplication.yml加载,这样可以针对不同的运行环境(开发、测试、生产等)进行差异化配置,保证各环境下应用的正确运行,同时又能共享通用的基础配置。
    • 常规配置基础application.propertiesapplication.yml作为通用配置,提供了应用的基本配置信息,在没有特定环境配置覆盖的情况下,这些配置会生效。
    • 细粒度配置控制@PropertySource注解加载的属性文件可以在代码层面更细粒度地控制配置的加载,比如加载一些特定模块的配置文件。但它优先级低于应用配置文件,这样可以保证应用整体配置的一致性和优先级。
    • 兜底默认值:默认属性作为最后的兜底设置,在其他配置都没有指定的情况下,提供一些合理的默认值,确保应用能以基本可用的状态启动。