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

文章目录

  • [1. @Value 注解读取单个属性](#1. @Value 注解读取单个属性)
  • [2. 使用 @ConfigurationProperties 注解](#2. 使用 @ConfigurationProperties 注解)
  • [3. 通过 Environment 对象读取属性](#3. 通过 Environment 对象读取属性)
  • [4. 使用 @PropertySource 注解加载额外的配置文件](#4. 使用 @PropertySource 注解加载额外的配置文件)

在 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 配置文件中添加如下配置:

    yml 复制代码
    app:
      name: MyApp
      keys:
        - key1
        - key2
  2. 使用 @Value 注解从配置文件中读取单个属性值:

    1. 字段注入 :将 @Value 注解应用于字段,Spring 将直接将配置值注入到字段中。

      java 复制代码
      @Component
      public class MyComponent {
      
          @Value("${app.name}")
          private String name;
      
      }
    2. 构造函数注入 :@Value 也可以用于构造函数参数。

      java 复制代码
      @Component
      public class MyComponent {
      
          private final String name;
      
          public MyComponent(@Value("${app.name}") String name) {
              this.name = name;
          }
      
      }
    3. 方法参数注入 :@Value 注解用于方法参数。

      java 复制代码
      @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}"

java 复制代码
@Value("${app.keys}")
private List<String> keys;

2. 使用 @ConfigurationProperties 注解

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

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

    yml 复制代码
    app:
      name: MyApp
      keys:
        - key1
        - key2
  2. 在类上使用 @ConfigurationProperties 注解,并指定前缀,该类会直接映射配置文件中的属性名一致属性:

    java 复制代码
    @Component
    @ConfigurationProperties(prefix = "app")
    public class AppProperties {
    
        private List<String> keys;
    
    }

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

3. 通过 Environment 对象读取属性

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

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

    yml 复制代码
    app:
      name: MyApp
      keys:
        - key1
        - key2
  2. 在类中注入 Environment 对象,使用env.getProperty(String key)来检索属性的值。

    java 复制代码
    @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 文件中的配置:

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 中。

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

    properties 复制代码
    app.name=MyApp
    app.version=1.0.0
  2. 在配置类上使用 @PropertySource 注解来加载配置文件:

    java 复制代码
    @Configuration
    @PropertySource("classpath:config.properties")
    //@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
    public class AppConfig {
        
    }
  3. 使用 @Value 注解或 Environment 对象获取属性:

    java 复制代码
    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 属性指定多个文件路径:

java 复制代码
@PropertySource({"classpath:config.properties", "classpath:another-config.properties"})
  1. 路径 :classpath: 前缀表示文件在类路径中。如果文件位于文件系统的其他位置,你可以使用文件系统路径,例如 file:/path/to/config.properties。
  2. 覆盖 :@PropertySource 加载的属性文件中的属性会覆盖同名的系统属性,但不会覆盖由 Spring Boot 的 application.properties 或 application.yml 文件中定义的属性。
  3. 顺序:如果多个属性文件定义了同一个属性,后加载的文件中的属性值会覆盖先加载的文件中的值。
相关推荐
EatFan9 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
Maiko Star10 小时前
* LangChain 提示词模板详解:ChatPromptTemplate 的使用与高级特性
java·人工智能·langchain
波力海苔夹心脆67511 小时前
C# 序列化与反序列化详解:System.Text.Json、Newtonsoft.Json、XmlSerializer 用法、特性选项与安全实践
经验分享·后端·c#·json·.net
现任明教教主~12 小时前
Thinkphp站群蜘蛛池SaaS系统YanyvSEO含多用户/积分/六大引擎计费/易支付对接
java·开发语言·spring
JavaGuide12 小时前
NVIDIA 又开源了!这次给 AI Agent 加上权限管控
前端·后端
excel12 小时前
prisma 如何处理数据库竞态
前端·数据库·后端
一条破秋裤13 小时前
Linux 线程创建:pthread_create 与基本回收
java·linux·运维
布吉岛的石头13 小时前
Java 程序员第 49 阶段5:BERT 预训练目标 MLM+NSP 的工程含义
java·人工智能·深度学习·bert·transformer
摇滚侠14 小时前
《On Java 中文版 基础卷》阅读笔记 对象无处不在 03
java·笔记·python