Spring Boot 读取配置文件的几种方式

Spring Boot 提供了灵活多样的方式来读取配置文件(如 application.ymlapplication.properties),本文介绍几种常见的读取方式。


1. 配置文件位置与加载顺序

Spring Boot 默认从以下位置加载配置文件(优先级从高到低):

  1. 命令行参数(如:--server.port=8081
  2. application.properties / application.yml(位于 classpath:/config/
  3. classpath:/application.propertiesapplication.yml
  4. 外部配置中心(如 Nacos、Spring Cloud Config)

2. 读取配置文件的方式汇总

Spring Boot 提供了多种读取配置文件的方式。


方式一:使用 @Value 注解读取配置

这种方式适合读取单个简单配置项。可以用来注入配置文件中的值,也可以指定默认值,防止配置项缺失时抛出异常 。

📄 配置文件:

app:
  name: order-v
  version: v1

示例代码:

@Component
public class AppProperties {

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

    @Value("${app.version:v1.0.0}")
    private String version;

    public void print() {
        System.out.println("App Name: " + name);
        System.out.println("App Version: " + version);
    }
}
  • : 后面就是默认值
  • 当配置文件中没有对应的值时,会使用默认值
  • 如果配置项存在对应的值,默认值不生效

测试代码:

@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }
}

优点:

  • 简单直接,适用于读取单个变量

缺点:

  • 不支持嵌套结构、不支持批量绑定、不利于维护

方式二:使用 @ConfigurationProperties 自动绑定配置类(推荐)

适合绑定多个字段、嵌套结构、List、Map等复杂配置

📄 配置文件:

app:
  name: order-v
  version: v1
  servers:
    - http://dev-server:8080
    - http://test-server:8081
    - http://prod-server:8082
  metadata:
    author: Alice
    version: 1.0.2
    website: https://emp.com
  modules:
    user:
      enabled: true
      path: /user
    admin:
      enabled: false
      path: /admin

配置类示例代码:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.Map;

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

    private String name;

    // List 示例
    private List<String> servers;

    // Map<String, String> 示例
    private Map<String, String> metadata;

    // Map<String, 自定义对象> 示例
    private Map<String, Module> modules;

    @Data
    public static class Module {
        private boolean enabled;
        private String path;
    }
    
    public void print() {
        System.out.println("name: " + name);
        System.out.println("servers: " + servers);
        System.out.println("metadata: " + metadata);
        System.out.println("modules: " + modules);
    }
}

使用示例:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import lombok.AllArgsConstructor;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }
}

优点:

  • 支持对象结构、嵌套对象、List、Map
  • 支持校验(配合 @Validated
  • 强类型绑定,IDE 支持友好

缺点:

  • 需要额外的类定义

方式三:使用 Environment 编程式读取配置

适合动态读取、条件判断场景

示例代码:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/24 17:28
 **/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;
    private final Environment env;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }

    @RequestMapping("/printEnv")
    public void printEnv() {
        String name = env.getProperty("app.name");
        System.out.println("app.name = " + name);
    }

}

优点:

  • 动态、灵活,支持条件判断
  • 可用于第三方库或工具类中

缺点:

  • 可读性差,不支持自动绑定

方式四:加载自定义配置文件(@PropertySource

当你需要读取非 application.yml 的配置文件时使用。

📄 自定义配置文件 sms-config.properties

sms.sign=aliyun
sms.template.code=TPL001

示例代码:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/25 10:08
 **/
@Configuration
@PropertySource("classpath:sms-config.properties")
@ConfigurationProperties(prefix = "sms")
@Data
public class SmsConfig {
    private String sign;
    private Template template;

    @Data
    public static class Template {
        private String code;
    }

    public void print() {
        System.out.println("sign : " + sign);
        System.out.println("template.code : " + template.getCode());
    }
}

使用实力:

import com.example.xiaoshitou.config.AppConfigProperties;
import com.example.xiaoshitou.config.AppProperties;
import com.example.xiaoshitou.config.SmsConfig;
import lombok.AllArgsConstructor;
import org.springframework.core.env.Environment;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/***
 * @title
 * @author shijiangyong
 * @date 2025/4/24 17:28
 **/
@RestController
@RequestMapping("/test")
@AllArgsConstructor
public class TestController {

    private final AppProperties appProperties;
    private final AppConfigProperties appConfigProperties;
    private final SmsConfig smsConfig;
    private final Environment env;

    @RequestMapping("/print")
    public void print() {
        appProperties.print();
    }

    @RequestMapping("/printConfig")
    public void printConfig() {
        appConfigProperties.print();
    }

    @RequestMapping("/printEnv")
    public void printEnv() {
        String name = env.getProperty("app.name");
        System.out.println("app.name = " + name);
    }


    @RequestMapping("/smsConfig")
    public void smsConfig() {
        smsConfig.print();
    }

}

优点:

  • 支持加载自定义配置文件
  • 可与 @ConfigurationProperties 搭配使用

缺点:

  • 不支持 .yml 格式
  • 不支持动态刷新

方式五:多环境配置(多 Profile)

适用于开发、测试、生产环境的配置隔离。

📄 配置文件:

# application-dev.yml
app:
  name: DevApp

# application-prod.yml
app:
  name: ProdApp

激活方式:

  • application.yml 中设置:
spring:
  profiles:
    active: dev
  • 或通过启动参数:
--spring.profiles.active=prod

优点:

  • 多环境隔离,配置清晰
  • 支持组合激活多个 profile

总结

场景推荐方式
读取单个简单值@Value
读取嵌套结构、对象@ConfigurationProperties
动态读取Environment
非默认配置文件@PropertySource
多环境支持多 profile
Spring Boot框架中,读取配置文件(通常是`application.properties`或`application.yml`)中的属性值可以借助一些特定的注解来完成。以下是几种常用的方式及其对应的注解: ### 1. 使用 `@Value` 这是最直接的一种方式,用于将单个配置项注入到字段中。 ```java @Value("${property.key}") private String propertyKey; ``` 例如,在`application.properties`中有如下配置: ```properties app.name=MyApp app.version=1.0.0 ``` 那么可以在代码里通过下面的方式来获取它们的值: ```java @Value("${app.name}") private String appName; @Value("${app.version}") private String appVersion; ``` --- ### 2. 使用 `@ConfigurationProperties` 当需要一次性绑定一组相关的属性时,推荐使用这种方式。它更适合管理复杂的、分组式的配置数据。 首先创建一个POJO类,并标注上`@ConfigurationProperties(prefix="prefix")`和`@Component`(让其被Spring容器扫描)。比如: ```java @Component @ConfigurationProperties(prefix = "app") public class AppConfig { private String name; private String version; // 需要有getter/setter方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getVersion() { return version; } public void setVersion(String version) { this.version = version; } } ``` 此时无需再单独标记每个成员变量为`@Value`形式了。 注意点:为了保证安全性以及避免意外的数据覆盖情况发生,建议开启校验功能: ```yaml spring: config: activate: on-profile: dev # 指定激活环境(dev/test/prod等) ``` 同时还可以结合`@Validated`来进行参数验证操作。 --- ### 3. 其他补充说明 除了上述两种主流做法之外,还有一些场景化的特殊处理手段可供参考学习,如动态刷新配置(`@RefreshScope`)配合云原生架构下的服务发现机制;又或者是利用Environment接口手动查找键值对等等……
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值