@Value配合${}读取外部属性文件需确保配置文件被Spring正确加载:默认加载application.properties/yml;自定义文件须用@PropertySource显式引入;支持默认值(如${key:default})、类型转换及UTF-8编码防乱码,未定义且无默认值将启动失败。

Spring 中使用 @Value 配合 ${} 表达式读取外部属性文件,核心在于正确加载配置文件并确保 Spring 能解析占位符。默认情况下 Spring 只加载 application.properties 或 application.yml,若用自定义文件(如 config.properties),需显式注册 PropertySourcesPlaceholderConfigurer 或使用 @PropertySource。
确保配置文件被 Spring 正确加载
Spring Boot 项目默认会自动加载 application.properties(或 .yml)中的属性,无需额外配置。若使用自定义文件(例如 db.properties),必须通过 @PropertySource 注解将其引入:
- 在启动类或配置类上添加:
@PropertySource("classpath:db.properties") - 路径支持
classpath:、file:等前缀;多个文件可用数组形式:@PropertySource({"classpath:a.properties", "classpath:b.properties"}) - 注意:Spring Boot 2.4+ 默认禁用了
spring.profiles.include和部分旧式加载方式,推荐优先使用application-{profile}.properties多环境方案
在 Bean 中用 @Value 读取属性值
@Value 支持标准 SpEL 表达式,读取属性时用 ${key} 语法,可指定默认值避免启动失败:
- 基本写法:
@Value("${database.url}") private String dbUrl; - 带默认值:
@Value("${database.timeout:3000}") private int timeout;(冒号后为默认值) - 支持类型转换:Spring 自动将字符串转为目标类型(如
int、boolean、Duration),但要求格式合法(如"true"→boolean,"PT10S"→Duration) - 不支持在静态字段上使用
@Value(因依赖注入发生在实例化后)
处理属性不存在或解析失败的情况
若属性未定义且未设默认值,应用启动时会抛出 IllegalArgumentException(提示“Could not resolve placeholder”)。应对方式包括:
立即学习“Java免费学习笔记(深入)”;
- 始终提供合理默认值,尤其对非关键配置
- 使用
@Value("${xxx:#{null}}")显式设为 null(需配合@Nullable或判空逻辑) - 启用 relaxed binding(Spring Boot 默认开启),允许
my-service.url匹配my_service_url或MY_SERVICE_URL - 检查配置文件编码是否为 UTF-8,避免中文乱码导致匹配失败
配合 @ConfigurationProperties 实现类型安全配置
对于结构化配置(如一组数据库参数),相比多个 @Value,更推荐使用 @ConfigurationProperties:
- 新建类标注
@ConfigurationProperties(prefix = "database"),字段名与属性 key 后缀一致(如url对应database.url) - 在主配置类上加
@EnableConfigurationProperties(DatabaseConfig.class)(Spring Boot 2.2+ 可省略) - 支持嵌套对象、集合、校验注解(如
@NotBlank),且 IDE 可提供属性提示 - 本质仍是基于相同属性源,但比分散的
@Value更易维护和测试


















