@Value用于从配置文件注入属性,需字段非static且类被Spring管理;支持默认值、类型转换和SpEL表达式,但静态字段、非托管类或构造器中直接使用会导致注入失败。

在 Spring 中,@Value 是最常用的属性注入方式之一,用于从配置文件(如 application.properties 或 application.yml)中读取值并注入到 Bean 的字段或方法参数中。使用简单,但有几个关键点必须注意,否则容易出现空值或注入失败。
基础用法:读取字符串属性
在类的字段上添加 @Value 注解,格式为 @Value("${key}"),其中 key 对应配置文件中的属性名:
# application.properties app.name=MySpringApp app.version=2.1.0
Java 类中注入:
@Component
public class AppConfig {
@Value("${app.name}")
private String appName;
<pre class='brush:java;toolbar:false;'>@Value("${app.version}")
private String appVersion;}
立即学习“Java免费学习笔记(深入)”;
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
- 字段必须是非 static 的,且所在类需被 Spring 管理(如加
@Component、@Service等) - 若配置项不存在,默认会抛出
IllegalArgumentException
提供默认值避免启动失败
用冒号 : 指定默认值,当配置未定义时使用该值:
@Value("${app.env:dev}")
private String env; // 若 application.properties 中无 app.env,则取 "dev"
- 默认值支持字符串、数字、布尔等字面量,如
"${server.port:8080}"、"${feature.enabled:true}" - 默认值不能含空格(除非用单引号包裹,如
'default value')
支持类型转换和 SpEL 表达式
@Value 内部基于 Spring 的类型转换器,可自动转成基本类型、包装类、枚举、集合(需配合 PropertyEditor 或 Converter),还支持简单 SpEL:
@Value("#{systemProperties['os.name']}") // 获取系统属性
@Value("${app.timeout:30000} * 2") // SpEL 计算:60000
@Value("${app.roles:admin,user}".split(",")) // 字符串转数组(需字段类型为 String[])
- SpEL 表达式以
#{...}开头,${...}是占位符语法,两者可混用 - 集合类型(List/Map)推荐用
@ConfigurationProperties替代,更安全、可校验
注意事项和常见问题
以下情况会导致 @Value 失效或为空:
- 字段是
static—— Spring 无法对静态字段进行依赖注入 - 类未被 Spring 托管(没加组件注解,或 new 出来的实例)—— 注入不会发生
- 在构造方法中直接使用
@Value字段(尚未注入)—— 应改用构造器参数注入或@PostConstruct - 配置文件未被正确加载(比如 profile 不匹配、文件名错误、编码问题)—— 检查日志中是否打印了 active profile 和配置加载路径
不复杂但容易忽略。

















