
spring 的 @value 注解支持字符串拼接形式的动态属性键引用,允许将配置键名提取为静态常量,提升代码复用性与可维护性,同时保持默认值机制有效。
spring 的 @value 注解支持字符串拼接形式的动态属性键引用,允许将配置键名提取为静态常量,提升代码复用性与可维护性,同时保持默认值机制有效。
在 Spring 应用中,我们常通过 @Value("${property.key:default}") 注入配置属性,并为其指定默认值(如 :10)。但当同一属性键(如 "health.xyz.throughput")在多处被重复使用时,硬编码字符串不仅违反 DRY 原则,还容易因拼写错误引发运行时异常。
幸运的是,Spring 容器在解析 @Value 表达式时,支持 Java 字符串拼接语法作为占位符的一部分——前提是该拼接发生在注解属性值的编译期字面量层面(即不涉及变量、方法调用等运行时逻辑)。
✅ 正确做法如下:
private static final String MY_VAR = "health.xyz.throughput";
@Value("${" + MY_VAR + ":10}")
private Integer healthThroughput;
该写法在编译后等价于 @Value("${health.xyz.throughput:10}"),Spring 可正常解析 SpEL 表达式并完成占位符替换与类型转换。
另一种等效且更简洁的写法是将完整表达式预定义为常量:
private static final String HEALTH_THROUGHPUT_PROP = "${health.xyz.throughput:10}";
@Value(HEALTH_THROUGHPUT_PROP)
private Integer healthThroughput;
⚠️ 注意事项:
- @Value 的值必须是编译时常量表达式(static final 字符串字面量拼接),不能使用非 final 变量、方法返回值或运行时计算结果,否则会导致编译错误(Attribute value must be constant);
- 不支持嵌套 SpEL 表达式(如 ${${myVar}:10}),Spring 不解析二次占位符;
- 若配置键不存在且未提供默认值(:10),将抛出 IllegalArgumentException 或 BeanCreationException;
- 推荐配合 @ConfigurationProperties 使用更复杂的配置结构,@Value 更适合简单、零散的属性注入。
综上,通过合理利用 Java 编译时常量拼接,你既能统一管理配置键名,又能保留 @Value 的灵活性与默认值能力,是提升 Spring 配置可维护性的实用技巧。










