@value 是 spring boot 中最轻量的配置注入方式,适用于简单类型配置项,需配合 spring 托管类使用,支持默认值、类型自动转换及 spel 安全处理,但不支持静态字段直接注入。

@Value 是 Spring Boot 中最轻量、最直接的配置注入方式,适合注入零散、简单类型的配置项,比如密钥、开关、超时时间、字符串列表等。它不依赖复杂结构,但用错场景或写法容易失效。
基础写法:从 application.yml 或 .properties 读值
确保配置在默认加载的文件中(如 application.yml):
crypt.aes.key: abc123def456 app.timeout: 5000 feature.enabled: true log.levels: info,warn,error
在 Spring 管理的类中(必须是 @Component、@Service 等)使用:
使用ydata-profiling(前身为pandas-profiling)生成全面的数据质量报告,包含相关性分析、缺失值模式和基数检测。导出交互式HTML仪表板和JSON摘要。
@Value("${crypt.aes.key}") private String aesKey;-
@Value("${app.timeout:3000}") private int timeout;—— 冒号后为默认值,键不存在时生效 -
@Value("${feature.enabled:true}") private boolean enabled;—— 布尔/数字类型无需引号,Spring 自动转换 -
@Value("${log.levels}") private String[] levels;—— 逗号分隔自动转数组;若字段是List<string></string>,也支持
处理默认值与空配置的细节
默认值写法简单,但要注意边界情况:
- 空字符串
${key:}表示“没配就为空”,不是 null - 集合类如
List<string></string>遇到未配置的 key,@Value("${list})会注入一个含空字符串的单元素列表([""]),易引发 NPE。建议改用 SpEL 安全拆分:@Value("#{'${list:}'.empty ? null : '${list:}'.split(',')}") private List<string> list;</string> - 嵌套占位符最多两级:
@Value("${com.example.path:${com.example.base}/config}")✅@Value("${a:${b:${c}}}")❌(第三层不解析)
静态字段怎么注入?
@Value 不能直接标注在 static 字段上(Spring 不支持)。正确做法是把注解加在 setter 方法上:
- 声明私有静态字段:
private static String KEY; - 提供 public setter,并加上 @Value:
@Value("${crypt.aes.key}")<br>public void setKey(String key) { KEY = key; } - 类仍需被 Spring 托管(如加 @Component)
常见失效原因和避坑点
@Value 为 null,90% 不是语法问题,而是环境或管理问题:
- 类没加 @Component 等注解,或用了
new Xxx()手动实例化 → Spring 容器完全不介入 -
配置文件名不是
application.yml或application.properties,又没用 @PropertySource 显式加载 - 在单元测试里只用
@MockitoExtension,没加 @SpringBootTest → Spring 上下文未启动,配置不加载 - 键名大小写不一致(
app.name≠APP.NAME),或 YAML 缩进错误导致解析失败 - .properties 文件含中文但未转义 → 推荐改用 YAML,天然 UTF-8 支持










