SpringBoot配置文件加载顺序

Spring Boot 加载 application.yml 或其他配置文件时遵循一定的优先级顺序,这个顺序决定了当存在多个同名配置时,哪个配置会最终生效。以下是Spring Boot配置文件加载的优先级列表,从高到低排列,比如我们有下面三个配置文件:

image-20240623160319810

1. 命令行参数 :

通过命令行直接传递的参数,如 --spring.profiles.active=prod,具有最高优先级。就是在我们编写启动jar脚本的时候进行设置,比如:

java -jar top.jar --spring.profiles.active=prod

这样我们就指定了配置文件为prod为后缀的配置文件启动。

2. 来自JVM系统属性:

通过 -Dspring.profiles.active=prod 设置的JVM系统属性。当你直接通过Java命令行启动Spring Boot应用的jar包时,可以添加 -Dspring.profiles.active 参数来指定激活的环境配置。命令格式如下:

java -jar top.jar -Dspring.profiles.active=prod

3. 配置文件的 profiles 版本:

如果指定了活动配置文件,如通过 spring.profiles.active,则会加载与之对应的 application-{profile}.ymlapplication-{profile}.properties,例如在 application.yml中指定启用application-dev.yml。

image-20240623160725890

spring:
  profiles:
    active: dev

4. 当前目录下的配置文件:

位于项目运行目录下的 config 子目录中的配置文件,例如 jar包和config文件夹一个目录,同一级别

image-20240623161721776

配置文件在config中:

image-20240623161807971

5. 当前目录配置文件:

直接位于项目运行目录下的配置文件,如 jar包和配置文件在同一个级别。

image-20240623161853385

6. 类路径上的 config 目录:

位于类路径 classpath:/config/ 下的配置文件。

image-20240623161933873

7. 类路径根目录:

位于类路径根目录下的配置文件,如 classpath:/application.yml

image-20240623161956898

8. Spring Cloud Config Server

或其他外部配置服务(如果使用的话):当应用与Spring Cloud Config Server或其他配置中心集成时,远程配置会覆盖本地配置,前提是远程配置被成功拉取且有效。这个后续在介绍cloud微服务的时候会在进行展示,nacos有专门的配置文件管理方案。

9. 默认配置:

最后,如果以上都没有找到对应配置,Spring Boot会使用其内部默认配置。

10. 注意

此外,如果通过 spring.config.location 属性指定了配置文件的自定义路径,那么这些自定义路径的配置文件会拥有比上述所有位置更高的优先级。

java -jar top.jar --spring.config.location=file:///path/to/config/application.yml

当有多个同名的配置文件存在于上述不同位置时,优先级高的配置文件会覆盖优先级低的配置文件中相同的配置项。这意味着,即使较低优先级的配置文件中包含了某个属性,如果较高优先级的配置文件中也定义了同样的属性,那么最终生效的将是较高优先级配置文件中的值。