SpringBoot中配置文件优先级和有哪些方式获取配置文件中的信息

本文详细介绍了SpringBoot中配置文件的优先级,从高到低依次为:file: ./config/、file: ./、classpath: config/、classpath:。配置文件之间互补且高优先级覆盖低优先级。此外,文章还探讨了通过@ConfigurationProperties和@Value注解获取配置信息的不同方式,以及如何处理静态属性、常量属性和普通属性的赋值问题。

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

SpringBoot中配置文件优先级和有哪些方式获取配置文件中的信息

一、SpringBoot中配置文件的优先级

1、file: ./config/ (./ 表示当前路径下 file表示是当前项目)

2、file: ./

3、classpath:config/

4、classpath:

从上到下,优先级依次递减!

各配置文件之间的特性:

①: 如果配置相同的东西 如:server.port ,高优先级的文件中的配置会覆盖低优先级的文件中的配置。
②: 各文件之间是互补配置的。

参考类: ConfigFileApplicationListener

二、有哪些方式获取配置文件中的信息?

1、获取application.properties(application.yml)中的配置信息

①:通过@ConfigurationProperties 注解来获取

接口定义:

@Target({
   
    ElementType.TYPE, ElementType.METHOD })    // 可以作用在类和方法上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ConfigurationProperties {
   
   
	@AliasFor("prefix")
	String value() default "";     // 表示前缀
	@AliasFor("value")
	String prefix() default "";    // 表示前缀
  
	boolean ignoreInvalidFields() default false;
	boolean ignoreUnknownFields() default true;

}

使用方式:

@ConfigurationProperties(prefix = "dog")  // 指定前缀
@Component
public class Dog {
   
   

    private String name;  // 自动绑定
  
  	private int age;
  
  	// 需要 对应的 setter 方法
}

配置文件信息:

dog.name=dog

dog.age=11
②:通过@Value注解来获取(value可以通过${}获取环境变量中的属性,#{}SPEL)

接口定义:

@Target({
   
   ElementType.FIELD, ElementType.METHOD, ElementType.PARAMETER, ElementType.ANNOTATION_TYPE})   // 可以作用在   字段、方法、参数、注解 上
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Value {
   
   
    String value();
}

使用方式:

@Component
public class Dog {
    @Value("${dog.name}")
    private String name;
    
    @Value("${dog.age}")
    private int age;
 }

配置文件信息:

dog.name=dog

dog.age=11

2、获取自定义配置文件(properties文件)中的配置信息

2.1、想要获取自定义配置文件(properties文件)中的配置信息,我们必须先加载该配置文件,通过@PropertySource注解加载

接口定义:

@Target(ElementType<
### Spring Boot 配置文件加载顺序及优先级解析 Spring Boot 的配置文件加载机制是一个复杂而有序的过程,其设计目的是为了支持多种场景下的灵活配置管理。以下是关于配置文件加载顺序及其优先级的具体说明: #### 1. 加载位置 Spring Boot 支持多个不同位置的配置文件加载,这些位置包括但不限于以下几种[^1]: - **命令行参数**:这是最高优先级的配置来源之一。 - **Java 系统属性 (System.getProperties())**:可以通过 `-D` 参数传递给 JVM。 - **操作系统环境变量**:由操作系统的环境变量提供。 - **当前应用程序包外的 `config` 子目录中的配置文件**:位于运行 jar 文件同级目录下名为 `config` 的子目录中。 - **当前应用程序包内的 `config` 目录中的配置文件**:嵌套于 jar 包内部的 `config` 目录。 - **当前应用程序根目录中的配置文件**:直接放置在 jar 包的根路径下。 #### 2. 加载顺序 Spring Boot 应用启动时会遵循一定的顺序来查找并加载配置文件。具体来说,这个过程分为以下几个阶段[^2][^3]: - **外部化配置**:Spring Boot 将优先考虑外部化的配置资源,比如命令行参数、系统属性环境变量等。 - **内置配置**:如果未找到外部化配置,则继续寻找内置的应用程序配置文件 (`application.properties` 或者 `application.yml`)。 具体的加载顺序如下: 1. 命令行参数。 2. 来自 Java 系统属性的属性。 3. 操作系统环境变量。 4. 当前应用程序所在目录的 `config/` 子目录中的配置文件。 5. 当前应用程序所在的目录中的配置文件。 6. classpath 中的 `/config/` 目录中的配置文件。 7. classpath 根目录中的配置文件。 #### 3. 优先级规则 配置项之间的冲突解决依赖于优先级规则。对于相同名称的配置项,较高优先级的配置将会覆盖较低优先级的配置[^5]。例如: - 如果某个配置既存在于命令行参数中也存在於 `application.properties` 文件中,那么命令行参数中的值将被采用。 - 自定义 Bean 对象通常具有更高的优先级,这意味着即使有自动装配的组件可用,开发者显式声明的 Bean 定义也会优先使用[^4]。 #### 4. 特殊情况处理 某些情况下可能还需要额外注意一些细节,例如: - 使用 Nacos 这样的分布式配置中心时,它的配置可能会进一步影响整体加载逻辑。 - 可以通过 `@PropertySource` 注解手动指定其他配置文件的位置,并将其纳入到 Spring 上下文中。 ```java // 示例代码展示如何利用 @PropertySource 添加额外配置源 @Configuration @PropertySource(value = "classpath:custom-config.properties", ignoreResourceNotFound = true) public class CustomConfig { // Configuration logic here... } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值