Spring Boot 加载文件的优先级从高到低依次顺序

SpringBoot在启动时会创建ApplicationContext容器,加载配置文件的顺序包括:Environment对象、默认配置、外部配置、命令行参数、环境变量、JNDI和Java系统属性。配置文件加载遵循特定的优先级,例如命令行参数、环境变量等可覆盖默认配置。最后,所有配置合并成一个PropertySource。了解这一过程有助于优化开发效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spring Boot 文章目录

Spring Boot 加载文件的优先级,如何加载配置文件
如何使用SpringBoot全局异常处理?有效提升开发效率



前言

当 Spring Boot 启动时,会调用 SpringApplication.run() 方法创建一个 ApplicationContext 容器,并加载配置文件。


一、代码流程

  • 创建 Environment:Spring Boot 首先会创建一个 Environment 对象,用于保存应用程序的配置信息。Environment 包含多个 PropertySource,每个 PropertySource 都代表一个配置源。

  • 加载默认配置:Spring Boot 会加载默认的配置文件,如 application.properties 和
    application.yml,将它们包装成一个 PropertySource,并添加到 Environment 中。

  • 加载外部配置:Spring Boot 会扫描指定的配置文件路径,加载所有匹配的配置文件,将它们包装成一个PropertySource,并添加到 Environment 中。可以通过设置 spring.config.name 和
    spring.config.location 属性来指定配置文件名和路径。

  • 加载命令行参数:如果启动命令中包含 --spring.config.name 和 --spring.config.location
    参数,则会使用这些参数覆盖之前加载的配置文件。

  • 加载环境变量:Spring Boot 会加载系统环境变量中以 SPRING_ 开头的变量,并将它们添加到 Environment 中。

  • 加载 JNDI:如果应用程序使用 JNDI 技术管理配置,则会加载 JNDI 中的配置项,并将它们添加到 Environment 中。

  • 合并配置:Spring Boot 将所有的配置信息合并成一个统一的 PropertySource,形成一个完整的配置信息。

  • 构建 ApplicationContext:根据配置信息创建 ApplicationContext 容器,并将所有的 Bean
    定义加载到容器中。

二、配置文件的加载顺序

  1. 命令行参数:使用 java -jar 命令启动时,可以使用 --spring.config.name 和 --spring.config.location 选项指定配置文件名和路径。

  2. 来自操作系统的环境变量:通过环境变量 SPRING_CONFIG_NAME 和 SPRING_CONFIG_LOCATION
    来指定配置文件名和路径。

  3. JNDI:如果使用 JNDI 技术管理应用程序的配置,可以使用 java:comp/env/spring.config.name 和
    java:comp/env/spring.config.location 分别指定配置文件名和路径。

  4. Java 系统属性:可以通过设置 System 属性 spring.config.name 和
    spring.config.location 来指定配置文件名和路径。

  5. 配置文件:默认情况下,Spring Boot 会在以下位置查找配置文件:

  6. 当前工作目录下的 /config 子目录 当前工作目录 classpath 下的 /config 包 classpath 根目录
    默认配置:Spring Boot 内置了一些默认配置,如 application.properties 和
    application.yml,如果没有指定其他配置文件,则会使用这些默认配置。

需要注意的是,如果存在多个配置文件,它们会被合并成一个配置文件。例如,如果同时存在 application.properties 和 application.yml 文件,则它们的配置项会被合并到一个统一的配置文件中。同时,如果多个配置项具有相同的属性名,后面的配置文件中的值会覆盖前面的配置文件中的值。


总结

以上就是便是springboot加载配置文件的全部流程,有不清楚的可以在评论区沟通。

<think>嗯,用户问的是Spring Boot的环境配置加载顺序,这个问题我需要仔细回想一下。首先,我记得Spring Boot有很多不同的配置来源,比如properties文件、YAML文件、环境变量、命令行参数等等。这些配置的加载顺序可能会影响最终生效的配置项,所以理解它们的优先级很重要。 首先,我应该从官方文档入手,确认各个配置源的加载顺序。根据Spring Boot的文档,配置是有一定的优先级的,优先级的配置会覆盖优先级的。例如,命令行参数通常优先级比较,因为可以在启动时指定,覆盖已有的配置。 然后,要列举出所有的配置源,并按照优先级排序。记得可能有这些:命令行参数、来自java:comp/env的JNDI属性、Java系统属性(System.getProperties())、操作系统环境变量、随机生成的属性(比如random.*),以及应用程序外部的配置文件,比如application-{profile}.properties或YAML文件,还有应用内部的配置文件,还有在@Configuration类上的@PropertySource注解,以及默认的SpringApplication.setDefaultProperties设置的属性。 需要确认它们的顺序是否正确。比如,命令行参数的优先级是否最?然后是Java系统属性,接着是环境变量,之后是外部配置文件,内部配置文件,最后是默认属性? 另外,不同位置的配置文件也有优先级。比如,当前目录下的/config子目录里的配置文件,是否比当前目录下的配置文件优先级?然后才是classpath下的/config包里的,然后是classpath根目录的。这部分可能需要具体说明。 还有,带有profile的配置文件是如何加载的。例如,application-dev.properties会在没有指定profile的配置文件之后加载,并且如果有相同的配置项,profile指定的会覆盖默认的? 可能还要提到,当同一个配置源中有多个文件时,比如多个application.properties,它们的加载顺序是怎样的。比如,外部的配置文件优先级于内部的,带profile的于不带profile的。 需要注意,YAML文件和properties文件加载顺序是否一样,或者是否有不同的处理方式。一般来说,YAML和properties的处理方式类似,只是格式不同,但它们的优先级应该根据位置来决定,而不是格式。 另外,可能需要提到Spring Boot 2.4之后对配置文件的处理方式是否有变化。比如,是否引入了新的处理机制,或者改变了加载顺序。但用户可能不需要那么详细的版本差异,除非问题特别指出。 总结下来,正确的顺序应该是从排列,每个配置源的优先级。例如: 1. 命令行参数 2. Java系统属性(-D参数) 3. 操作系统环境变量 4. 外部配置文件(比如在文件系统中的application.properties) 5. 内部配置文件(比如打包在jar内的application.properties) 6. @PropertySource注解指定的配置文件 7. SpringApplication.setDefaultProperties设置的默认属性 不过可能有些细节需要调整,比如JNDI属性的位置,或者随机属性的位置。这时候需要查阅最新的Spring Boot文档来确认。 另外,当存在多个配置文件时,比如不同profile的情况,带profile的配置文件会在默认的配置文件之后加载,所以它们的配置项会覆盖默认的。例如,application-dev.properties中的配置会覆盖application.properties中的相同项。 还需要注意,配置文件加载位置,比如classpath:/config/,classpath:/,当前目录的./config/,当前目录的./,它们的优先级顺序是当前目录的./config/最,然后依次。 总结起来,整个加载顺序应该是按照优先级排列,每个来源覆盖之前的配置。这样用户在配置时就能知道哪些配置会生效,避免冲突。 最后,在回答时要结构清晰,分点说明各个配置源的顺序,可能用数字列表或者层次结构来展示,让用户容易理解。同时,可能需要给出一个例子,比如命令行参数如何覆盖其他配置,或者不同位置的配置文件如何生效。</think>Spring Boot的环境配置加载顺序遵循明确的优先级规则,多个配置源会按顺序叠加,优先级的覆盖的。以下是详细顺序解析: --- ### **1. 命令行参数** - **最优先级** 通过`--key=value`形式传递(如`java -jar app.jar --server.port=8081`),直接覆盖其他配置。 --- ### **2. Java系统属性(System.getProperties())** - 通过`-D`参数设置(如`-Dserver.port=8082`)。 --- ### **3. 操作系统环境变量** - 直接读取操作系统的环境变量(如`export SERVER_PORT=8083`)。 *注意:变量名需转换为大写并用下划线分隔(如`server.port`对应`SERVER_PORT`)。* --- ### **4. 外部配置文件优先级)** 1. 当前目录下的`/config`子目录 - `./config/application.properties` 2. 当前目录根目录 - `./application.properties` 3. Classpath下的`/config`目录 - `classpath:/config/application.properties` 4. Classpath根目录 - `classpath:/application.properties` --- ### **5. Profile-specific配置文件** - **命名规则**:`application-{profile}.properties` 例如:`application-dev.properties`会覆盖`application.properties`中的相同配置。 *激活方式*:通过`spring.profiles.active=dev`指定。 --- ### **6. @PropertySource注解** - 代码中通过`@PropertySource("classpath:custom.properties")`加载的配置文件优先级于默认的`application.properties`。 --- ### **7. 默认属性(SpringApplication.setDefaultProperties)** - 通过代码设置的默认值,优先级。 例如:`SpringApplication.setDefaultProperties(Collections.singletonMap("server.port", "8084"))`。 --- ### **加载顺序总结** ```text 命令行参数 → Java系统属性 → 环境变量 → 外部配置文件 → Profile-specific文件 → @PropertySource → 默认属性 ``` --- ### **示例:配置覆盖逻辑** 假设以下配置同时存在: 1. `application.properties`中定义`server.port=8080` 2. 命令行启动时指定`--server.port=8081` 3. 环境变量设置`SERVER_PORT=8082` 最终生效的端口是**8081**(命令行参数优先级)。 --- ### **最佳实践** - **关键配置**优先用命令行或环境变量(如生产环境的数据库密码)。 - **通用配置**放在`application.properties`中。 - **多环境**使用`application-{profile}.properties`隔离配置。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值