一文带你完全掌握SpringBoot中配置的优先级

 更新时间:2026年03月01日 09:23:22   作者:程序员越  
在现代Spring Boot应用开发中,理解配置文件的加载顺序和优先级至关重要,本文将深入剖析包括Nacos远程配置、本地properties和yml文件在内的各种配置源的优先级关系,希望可以帮助开发者掌握配置管理的最佳实践

一、配置优先级核心原则

Spring Boot配置系统基于几个核心原则构建:

  • 就近原则:离应用运行环境越近的配置优先级越高
  • 特定性原则:越具体的配置优先级越高
  • 外部化原则:外部配置优先于内部配置

二、全局配置源优先级总览

当存在多个配置源时,Spring Boot按照以下优先级顺序加载(从高到低):

最高优先级配置源

1. 命令行参数

java -jar app.jar --server.port=8087 --spring.datasource.url=jdbc:mysql://localhost:3306/mydb

2. SPRING_APPLICATION_JSON属性

SPRING_APPLICATION_JSON='{"server":{"port":9090}}' java -jar app.jar

3. ServletConfig初始化参数

4. ServletContext初始化参数

5. JNDI属性(来自 java:comp/env)

6. Java系统属性(System.getProperties())

7. 操作系统环境变量

文件配置源优先级

8. 项目外部Profile特定配置

  • file:./config/application-{profile}.yml/properties
  • file:./application-{profile}.yml/properties

9. 项目内部Profile特定配置

  • classpath:/config/application-{profile}.yml/properties
  • classpath:/application-{profile}.yml/properties

10. 项目外部默认配置

  • file:./config/application.yml/properties
  • file:./application.yml/properties

11. 项目内部默认配置

  • classpath:/config/application.yml/properties
  • classpath:/application.yml/properties

最低优先级配置源

12. @PropertySource注解

13. 默认属性(通过SpringApplication.setDefaultProperties指定)

三、Nacos配置与本地配置的优先级关系

在微服务架构中,Nacos作为配置中心时,其与本地配置的优先级关系如下:

Nacos配置优先级顺序

高优先级 → 低优先级

1. Nacos上的dataId带有特定Profile的配置

例如:myapp-test.yaml(对应test环境)

2. Nacos上的dataId不带Profile的配置

例如:myapp.yaml(通用配置)

3. 项目本地application-{profile}.yml/properties文件

4. 项目本地application.yml/properties文件

5. 项目本地bootstrap-{profile}.yml/properties文件

6. 项目本地bootstrap.yml/properties文件

关键特性说明

  • Nacos配置默认覆盖本地配置:一旦应用成功连接Nacos,远程配置会覆盖本地同名属性
  • Profile特异性优先:无论本地还是远程,带环境后缀的配置优先级更高
  • bootstrap配置的特殊性:虽然先加载,但仍可能被Nacos配置覆盖

四、YAML与Properties文件格式优先级

在相同位置和命名条件下,不同文件格式的优先级规则如下:

文件格式优先级规则

当文件路径和名称完全相同时,加载顺序决定覆盖关系:

  • application.yml(后加载,可覆盖)
  • application.properties(先加载,被覆盖)

实际加载顺序示例

# application.properties 内容:
server.port=8081
app.name=MyApp from Properties

# application.yml 内容:
server:
  port: 8082
app:
  name: MyApp from YAML

# 最终结果:
# server.port = 8082 (YAML生效)
# app.name = MyApp from YAML (YAML生效)

五、完整配置加载层次结构

综合所有配置源,完整的优先级层次结构如下:

最高层:运行时配置

  • 命令行参数
  • 环境变量
  • 系统属性

中间层:远程配置中心

  • Nacos Profile特定配置
  • Nacos 默认配置
  • 其他配置中心(Consul, Apollo等)

基础层:本地文件配置

外部配置文件(优先级高→低):

  • ./config/bootstrap-{profile}.yml./config/bootstrap-{profile}.properties
  • ./config/bootstrap.yml
  • ./config/bootstrap.properties
  • ./config/application-{profile}.yml./config/application-{profile}.properties
  • ./config/application.yml./config/application.properties

内部配置文件(优先级高→低):

  • classpath:/bootstrap-{profile}.yml
  •  classpath:/bootstrap-{profile}.properties 
  • classpath:/bootstrap.yml
  • classpath:/bootstrap.properties
  • classpath:/application-{profile}.yml
  • classpath:/application-{profile}.properties
  • classpath:/application.yml
  • classpath:/application.properties

最底层:代码默认配置

  • @PropertySource注解配置
  • SpringApplication.setDefaultProperties

六、配置优先级控制与最佳实践

1. Nacos配置覆盖控制

# bootstrap.yml
spring:
  cloud:
    nacos:
      config:
        # 设置为true时,Nacos不会覆盖任何本地配置
        override-none: false
        # 启用配置自动刷新
        refresh-enabled: true

2.  环境隔离策略

# 开发环境:优先使用本地配置
spring:
  cloud:
    nacos:
      config:
        override-none: true

# 生产环境:强制使用Nacos配置
spring:
  cloud:
    nacos:
      config:
        override-none: false

3. 配置文件组织建议

  • 固定不变的基础配置:放在bootstrap.yml中(应用名、Nacos地址等)
  • 环境相关配置:使用Nacos并按环境区分dataId
  • 敏感信息:使用专业密钥管理服务,避免硬编码
  • 本地开发:利用override-none=true或本地Nacos Server

七、实战验证技巧

查看生效配置

@RestController
public class ConfigController {
    
    @Value("${server.port}")
    private String serverPort;
    
    @GetMapping("/config-check")
    public String checkConfig() {
        return "当前server.port: " + serverPort;
    }
}

启动时查看配置加载顺序

# 添加启动参数查看详细配置信息
java -jar app.jar --debug

八、总结

掌握Spring Boot配置优先级的关键要点:

  • 优先级口诀:外优于内,profile优于默认,bootstrap优于application,同位置下yml胜出
  • Nacos原则:远程配置默认优先,环境特异性配置最高
  • 实践准则:利用不同优先级实现环境隔离和灵活配置

通过合理运用这些优先级规则,可以构建出既灵活又安全的配置管理体系,为应用的开发、测试和生产部署提供坚实基础。

以上就是一文带你完全掌握SpringBoot中配置的优先级的详细内容,更多关于SpringBoot配置优先级的资料请关注脚本之家其它相关文章!

相关文章

  • SpringBoot 容器刷新前回调ApplicationContextInitializer

    SpringBoot 容器刷新前回调ApplicationContextInitializer

    这篇文章主要为大家介绍了SpringBoot 容器刷新前回调ApplicationContextInitializer使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • Java的栈与队列实现代码解析

    Java的栈与队列实现代码解析

    栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍Java的栈与队列实现代码,感兴趣的朋友一起看看吧
    2025-04-04
  • Java 添加、修改、读取、复制、删除Excel批注的实现

    Java 添加、修改、读取、复制、删除Excel批注的实现

    这篇文章主要介绍了Java 添加、修改、读取、复制、删除Excel批注的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • 详解java 中的CAS与ABA

    详解java 中的CAS与ABA

    这篇文章主要介绍了java 中的CAS与ABA的相关资料,帮助大家更好的理解和学习使用Java,感兴趣的朋友可以了解下
    2021-05-05
  • java获取当前时间和前一天日期(实现代码)

    java获取当前时间和前一天日期(实现代码)

    java获取当前时间和前一天日期的实现代码。需要的朋友可以过来参考下,希望对大家有所帮助
    2013-10-10
  • 浅谈spring DI 依赖注入方式和区别

    浅谈spring DI 依赖注入方式和区别

    Spring框架对Java开发的重要性不言而喻,本文主要介绍了spring DI 依赖注入方式和区别,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • java利用数组随机抽取幸运观众

    java利用数组随机抽取幸运观众

    这篇文章主要为大家详细介绍了java利用数组随机抽取幸运观众,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-05-05
  • Java 栈和队列的相互转换详解

    Java 栈和队列的相互转换详解

    栈和队列,严格意义上来说,也属于线性表,因为它们也都用于存储逻辑关系为 "一对一" 的数据,但由于它们比较特殊,因此将其单独作为一章,做重点讲解
    2022-02-02
  • MyBatis-Plus实现自动填充功能的示例代码

    MyBatis-Plus实现自动填充功能的示例代码

    在数据库设计中,常常有一些字段每次都需要赋值,如创建时间、更新时间、操作人、删除标识等,有没有框架级的技术,全局处理这样的统一字段呢?当然有,Mybatis-Plus自动填充技术帮我们解决问题,本文给大家详细介绍了MyBatis-Plus实现自动填充功能,需要的朋友可以参考下
    2025-07-07
  • Java向MySQL添加中文数据数据库显示乱码的解决方案

    Java向MySQL添加中文数据数据库显示乱码的解决方案

    在用springboot做项目时,由于重新安装了本地Mysql数据库(5.7版本)在前台向数据库插入和更新数据可的时候,涉及中文的时候在数据库一直显示异常,所以本文给大家介绍了相关的解决方案,需要的朋友可以参考下
    2024-02-02

最新评论