当前位置: 首页 > news >正文

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-vversion: 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-vversion: v1servers:- http://dev-server:8080- http://test-server:8081- http://prod-server:8082metadata:author: Aliceversion: 1.0.2website: https://emp.commodules:user:enabled: truepath: /useradmin:enabled: falsepath: /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;@Datapublic 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;@Datapublic 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
http://www.xdnf.cn/news/142831.html

相关文章:

  • 国产32位单片机PY32F003,ADC使用注意事项
  • 【计算机网络】IP地址
  • 聊聊Spring AI Alibaba的YoutubeDocumentReader
  • 从零开始掌握Linux数据流:管道与重定向完全指南
  • 【计算机视觉】CV实战 - 基于YOLOv5的人脸检测与关键点定位系统深度解析
  • BT150-ASEMI机器人率器件专用BT150
  • G1垃圾回收器中YoungGC和MixedGC的区别
  • HarmonyOS NEXT应用开发-Notification Kit(用户通知服务)notificationManager.addSlot
  • POI从入门到上手(一)-轻松完成Apache POI使用,完成Excel导入导出.
  • 【滑动窗口+哈希表/数组记录】Leetcode 438. 找到字符串中所有字母异位词
  • 《100天精通Python——基础篇 2025 第3天:变量与数据类型全面解析,掌握Python核心语法》
  • 基于大模型对先天性巨结肠全流程预测及医疗方案研究报告
  • ​升级Ubuntu 20.04 LTS到22.04 LTS​
  • Python 教程:我们可以给 Python 文件起中文名吗?
  • EDI 如何与 ERP,CRM,WMS等系统集成
  • 各类前端开发的框架比较及其核心特性、开发体验、生态系统以及在不同项目中的适用性
  • AUTOSAR图解==>AUTOSAR_SWS_SAEJ1939TransportLayer
  • 每日c/c++题 备战蓝桥杯(P1049 [NOIP 2001 普及组] 装箱问题)
  • PostgreSQL 漏洞信息详解
  • DAX Studio将PowerBI与EXCEL连接
  • 【遥感图像分类】【综述】遥感影像分类:全面综述与应用
  • 广州 3D 展厅开启企业展示新时代​
  • SecMulti-RAG:兼顾数据安全与智能检索的多源RAG框架,为企业构建不泄密的智能搜索引擎
  • python如何取消word中的缩进
  • 深入解析 SMB 相关命令:smbmap、smbclient、netexec 等工具的使用指南
  • 如何在Linux用libevent写一个聊天服务器
  • 基于多技术栈的数学问题求解系统设计与实现
  • Winform(1.Winform控件学习)
  • Java—数 组
  • Unity 打包后 无阴影 阴影不显示