@Value默认值用冒号指定,占位符嵌套仅支持两级展开;数组集合默认值自动转换,空格需注意;失效主因是类未交由Spring管理、键名错误、文件未加载或非Spring托管类中使用。

@Value 注入默认值和属性占位符是 Spring Boot 配置管理中最常用也最容易出错的环节。核心在于:默认值用冒号 : 指定,而占位符嵌套有严格层级限制——最多只支持两级展开,不能递归解析。
基础默认值写法
当配置项未定义时,直接提供 fallback 值即可:
-
@Value("${app.timeout:3000}")→ 若app.timeout不存在,注入3000 -
@Value("${app.env:dev}")→ 字符串默认值无需引号,Spring 自动识别 -
@Value("${app.debug:false}")→ 布尔值、数字等基本类型也直接支持,默认转换由 Spring 完成
数组与集合的默认值
逗号分隔的字符串会自动转为对应结构:
-
@Value("${app.roles:admin,user}")→ 注入String[]或List(取决于字段类型) -
@Value("${app.ports:8080,8081}")→ 可注入int[]或List,前提是类型匹配且能转换
注意:空格会被保留,建议避免在逗号后加空格,或统一用 SpEL 处理格式(如 #{'${app.roles:admin,user}'.split(',')})。
属性占位符嵌套回退(两级有效)
想实现“A 未配则用 B,B 未配则用 C + 后缀”,必须写成单行嵌套表达式:
- ✅ 正确:
@Value("${com.example.path:${com.example.base}/config}")—— base 存在就拼接,否则启动失败(因无更深层默认) - ✅ 两级安全:
@Value("${com.example.conf:${com.example.path:${com.example.root}/app}/conf}")—— root 必须存在,path 和 conf 可选 - ❌ 错误:
@Value("${a:${b:${c}}}")—— 三层嵌套不被解析,抛IllegalArgumentException
本质是语法展开:Spring 把 ${outer:${inner:default}} 当作一个整体解析两次,不是递归求值。
常见失效原因
@Value 不生效,往往不是语法问题,而是使用方式不对:
- 类没交给 Spring 管理(比如用
new Xxx()实例化),字段永远为 null - 配置键名拼写错误或大小写不一致(
app.name≠APP.NAME) - 自定义 properties 文件未用
@PropertySource显式加载 - 在非 @Component / @Configuration 类中使用 @Value(Spring 不扫描也不注入)











