Spring Boot 读取配置文件的几种方式
Spring Boot 提供了灵活多样的方式来读取配置文件(如 application.yml 或 application.properties),本文介绍几种常见的读取方式。
1. 配置文件位置与加载顺序
Spring Boot 默认从以下位置加载配置文件(优先级从高到低):
- 命令行参数(如:--server.port=8081)
- application.properties / application.yml(位于 classpath:/config/)
- classpath:/application.properties 或 application.yml
- 外部配置中心(如 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 servers; // Map 示例 private Map metadata; // Map 示例 private Map 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
- 或通过启动参数:
- 在 application.yml 中设置:
- 可读性差,不支持自动绑定
- 需要额外的类定义
- 不支持嵌套结构、不支持批量绑定、不利于维护
- 简单直接,适用于读取单个变量
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们。




