SpringBoot加载配置文件的优先级,90%的人容易用错!
大家好,我是猿java。
在 SpringBoot 应用中,配置文件的加载顺序(优先级)决定了不同来源的配置属性如何覆盖彼此,但是,在实践中,很多人都没有意识到这一点。这篇文章,我们将分析 SpringBoot 配置文件加载的优先级,从高到低排列。
1. 命令行参数
通过命令行(Command-line arguments)传递的参数具有最高优先级。
如下示例,在启动应用时传递命令行参数--server.port=8081:
1  | java -jar myapp.jar --server.port=8081  | 
2. Java 系统属性
在启动应用时通过 -D 选项设置的系统属性。
如下示例,在启动应用时设置 -Dserver.port=8081 系统属性:
1  | java -Dserver.port=8081 -jar myapp.jar  | 
3. 操作系统环境变量
设置在操作系统级别的环境变量。例如,SERVER_PORT=8081。
4.random 配置属性源(Random Configuration Property Sources):**
包括 random.* 属性,用于生成随机数或其他随机相关的配置。
5. application.{profile}.properties 或 application.{profile}.yml 文件
基于当前激活的 Spring Profile 加载的配置文件。例如,如果激活了 dev 环境,则加载 application-dev.properties。
6. application.properties 或 application.yml 文件
默认的配置文件,通常位于 src/main/resources 目录下。
7. @PropertySource 注解指定的属性文件
- 通过在配置类上使用 
@PropertySource注解加载的自定义属性文件。 
8. 默认属性
使用 SpringApplication.setDefaultProperties 设定的默认属性。
配置文件的搜索顺序
Spring Boot 在不同位置搜索 application.properties 或 application.yml 文件,以下是搜索的顺序,从高到低优先级:
外部位置(当前目录、上级目录等):
file:./config/file:./file:../config/file:../
这意味着如果你在应用程序的当前目录或其上级目录中有配置文件,这些文件的优先级高于类路径下的配置文件。
类路径下的
/config子目录:classpath:/config/
类路径根目录:
classpath:/
配置优先级示例
假设存在以下配置来源:
application.properties在类路径根目录中设置server.port=8080application-dev.properties在类路径下的config目录中设置server.port=8081- 外部 
application.properties文件设置server.port=8082 - 命令行参数传递 
--server.port=8083 
在激活 dev Profile 的情况下,最终 server.port 的值将是 8083。这是因为命令行参数的优先级最高,覆盖了其他所有配置来源。
激活 Profile
可以通过以下方式激活特定的 Spring Profile:
命令行参数:
1
java -jar myapp.jar --spring.profiles.active=dev
环境变量:
设置SPRING_PROFILES_ACTIVE=dev配置文件:
在application.properties中设置spring.profiles.active=dev
属性覆盖规则
同一属性名在多个来源中定义时,优先级高的来源会覆盖低的。例如:
application.properties中定义app.name=MyApp- 外部 
application.properties中定义app.name=ExternalApp 
若外部位置的配置文件优先级更高,则最终
app.name为ExternalApp。
总结
了解 Spring Boot 的配置文件加载优先级有助于:
- 正确组织和管理配置文件,确保不同环境下的配置正确应用。
 - 避免意外覆盖,通过明确的优先级控制哪些配置生效。
 - 优化配置管理流程,尤其是在复杂项目或多环境部署时。
 
10. 学习交流
如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。