SpringBoot读取配置文件的四种方式

 更新时间:2024年08月21日 09:59:07   作者:@赵士杰  
在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/main/resources 目录下的 application.properties 或 application.yml 文件中读取配置,本文介绍了SpringBoot读取配置文件的四种方式,需要的朋友可以参考下

引言

在 Spring Boot 中,application.yml 文件用于配置应用程序的属性,Spring Boot 默认会从 src/main/resources 目录下的 application.properties 或 application.yml 文件中读取配置。读取 application.yml 文件中的配置可以通过以下几种常用的方法进行:

  1. @Value: 适合读取简单的单一属性。
  2. @ConfigurationProperties: 适合读取复杂的配置集。
  3. Environment: 适合在运行时动态访问配置。
  4. @PropertySource: 加载 .properties 文件。

1. @Value 注解读取单个属性

@Value 注解用于读取单一简单的配置属性,该注解可以直接应用于字段、构造函数或方法参数上,不要求提供 Setter 方法。

  1. 在 application.yml 配置文件中添加如下配置:

app:
  name: MyApp
  keys:
    - key1
    - key2

使用 @Value 注解从配置文件中读取单个属性值:

  • 字段注入:将 @Value 注解应用于字段,Spring 将直接将配置值注入到字段中。
@Component
public class MyComponent {

    @Value("${app.name}")
    private String name;

}
  • 构造函数注入@Value 也可以用于构造函数参数。
@Component
public class MyComponent {

    private final String name;

    public MyComponent(@Value("${app.name}") String name) {
        this.name = name;
    }

}
  • 方法参数注入@Value 注解用于方法参数。
@Component
public class MyComponent {

    private String name;

    @Value("${app.name}")
    public void setKeys(String name) {
        this.name = name;
    }

}

注意:@Value 注解无法处理复杂的配置,如集合,如下处理会在应用启动时抛出 IllegalArgumentException 异常:Could not resolve placeholder 'app.keys' in value "${app.keys}"

@Value("${app.keys}")
private List<String> keys;

2. 使用 @ConfigurationProperties 注解

@ConfigurationProperties 用于将配置文件中的属性绑定到 Java 对象中。适合处理结构化的配置,比如嵌套的属性或复杂的属性集合。

  • 在 application.yml 配置文件中添加如下配置:
app:
  name: MyApp
  keys:
    - key1
    - key2

在类上使用 @ConfigurationProperties 注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:

@Component
@ConfigurationProperties(prefix = "app")
public class AppProperties {

    private List<String> keys;

}

注意:@ConfigurationProperties 读取配置时需要确保配置文件中的属性名与 Java 类中的属性名匹配。

3. 通过 Environment 对象读取属性

Environment 是 Spring 中用于管理和访问配置属性、配置文件和环境变量的一个抽象接口,该对象提供了一种管理和访问配置属性、激活的配置文件和环境变量的统一方式。我们可以在任何 Spring 管理的 bean 中通过注入 Environment 对象来获取配置属性。

  • 在 application.yml 配置文件中添加如下配置:
app:
  name: MyApp
  keys:
    - key1
    - key2
  • 在类中注入 Environment 对象,使用env.getProperty(String key)来检索属性的值。
@Component
public class MyComponent {

    @Autowired
    private Environment env;

    public void printConfig() {
        String port = env.getProperty("server.port");
        System.out.println("Server Port: " + port);
    }
}

注意:Environment 在加载 YML 配置文件时,会将每个元素视为单独的键。

即 application.yml 文件中的配置:

yamlCopy Codeapp:
  keys:
    - key1
    - key2
    - key3

在 Environment 中,将被处理为:

  • app.keys[0] 对应 key1
  • app.keys[1] 对应 key2
  • app.keys[2] 对应 key3

因此对于复杂配置需要特殊处理,例如获取集合元素需要使用类似数组索引的语法来访问 YAML 文件中的列表元素。

4. 使用 @PropertySource 注解加载额外的配置文件

@PropertySource 注解是 Spring Framework 提供的一个注解,用于加载额外 .properties 配置文件或其他资源文件中的属性到 Spring 的 Environment 中。

在 src/main/resources 目录下创建 config.properties 的属性文件:

app.name=MyApp
app.version=1.0.0

在配置类上使用 @PropertySource 注解来加载配置文件:

@Configuration
@PropertySource("classpath:config.properties")
//@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
public class AppConfig {
    
}

使用 @Value 注解或 Environment 对象获取属性:

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class MyComponent {

    @Value("${app.name}")
    private String appName;

    @Autowired
    private Environment env;

    public void printAppInfo() {
        System.out.println("App Name: " + appName);
        String appVersion = env.getProperty("app.version");
        System.out.println("App Version: " + appVersion);
    }
}

注意: 如果需要加载多个属性文件,可以在 @PropertySource 注解中使用 value 属性指定多个文件路径:

@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
  • 路径:classpath: 前缀表示文件在类路径中。如果文件位于文件系统的其他位置,你可以使用文件系统路径,例如 file:/path/to/config.properties。
  • 覆盖:@PropertySource 加载的属性文件中的属性会覆盖同名的系统属性,但不会覆盖由 Spring Boot 的 application.properties 或 application.yml 文件中定义的属性。
  • 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。

以上就是SpringBoot读取配置文件的四种方式的详细内容,更多关于SpringBoot读取配置文件的资料请关注脚本之家其它相关文章!

相关文章

  • Java 正则表达式入门详解(基础进阶)

    Java 正则表达式入门详解(基础进阶)

    最近看到很多同学想要学习java正则表达式的一些知识,那么脚本之家小编就为大家介绍一下,其实正则表达式实用性很强,处理大幅文字的时候都需要用得到,语法也大同小异
    2017-10-10
  • 带你了解Java数据结构和算法之哈希表

    带你了解Java数据结构和算法之哈希表

    这篇文章主要为大家介绍了Java数据结构和算法之哈希表,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助
    2022-01-01
  • 浅谈一下SpringCloud中Hystrix服务熔断和降级原理

    浅谈一下SpringCloud中Hystrix服务熔断和降级原理

    这篇文章主要介绍了浅谈一下SpringCloud中Hystrix服务熔断和降级原理,Hystrix 是 Netflix 的一款开源的容错框架,通过服务隔离来避免由于依赖延迟、异常,引起资源耗尽导致系统不可用的解决方案,需要的朋友可以参考下
    2023-05-05
  • spring5新特性全面介绍

    spring5新特性全面介绍

    本文将全面介绍 Spring 5。我将介绍 Java SE 8 和 Java EE 7 API 的基准升级、Spring 5 的新反应式编程模型、HTTP/2 支持,以及 Spring 通过 Kotlin 对函数式编程的全面支持。
    2020-10-10
  • springboot集成redisson的三种方式

    springboot集成redisson的三种方式

    本文主要介绍了springboot集成redisson的三种方式,包含自定义配置+手动注入,使用Yaml方式批量读取配置和spring boot自动配置类这三种,具有一定的参考价值,感兴趣的可以了解一下
    2024-03-03
  • 浅谈一下Java为什么不能使用字符流读取非文本的二进制文件

    浅谈一下Java为什么不能使用字符流读取非文本的二进制文件

    这篇文章主要介绍了浅谈一下为什么不能使用字符流读取非文本的二进制文件,刚学Java的IO流部分时,书上说只能使用字节流去读取图片、视频等非文本二进制文件,不能使用字符流,否则文件会损坏,需要的朋友可以参考下
    2023-04-04
  • Java中实现接口限流的方案详解

    Java中实现接口限流的方案详解

    常用的接口限流方案就是计数器限流方案、时间窗口限流方案和令牌桶限流方案等,这些方案的概念大致也知道,但是实际上也没有实现过,所以本文就来自动动手实践一下吧
    2023-05-05
  • Spring学习之Bean的装配多种方法

    Spring学习之Bean的装配多种方法

    本篇文章主要介绍了Spring学习之Bean的装配三种方法,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • Java中的自旋锁与适应性自旋锁的区别

    Java中的自旋锁与适应性自旋锁的区别

    这篇文章主要介绍了Java中的自旋锁与适应性自旋锁的区别,当一个线程尝试去获取某一把锁的时候,如果这个锁此时已经被别人获取(占用),那么此线程就无法获取到这把锁,该线程将会等待,间隔一段时间后会再次尝试获取,需要的朋友可以参考下
    2023-10-10
  • java数据类型与变量的安全性介绍

    java数据类型与变量的安全性介绍

    这篇文章主要介绍了java数据类型与变量的安全性介绍,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的朋友可以参考一下
    2022-07-07

最新评论