spring中用@value读取yaml数组需配合spel表达式#{...},推荐用@configurationproperties绑定结构化配置,更类型安全且支持校验。

Spring 中用 @Value 读取 YAML 中的数组或集合配置,关键在于写对 SpEL 表达式,并确保 YAML 格式与 Java 类型匹配。直接用 @Value("${key}") 无法自动转换复杂结构,需配合 #{...} SpEL 解析。
YAML 中定义数组/集合
YAML 支持多种写法,推荐清晰、可读性强的格式:
- 行内数组:
my.list: [a, b, c] - 多行列表:
my.list:<br> - apple<br> - banana<br> - cherry
- 混合类型(不推荐):尽量保持元素类型一致,如全为字符串或全为数字
@Value 读取字符串数组(String[])
最常用且最稳定的方式是注入为 String[],再按需转换:
@Value("${my.list}")<br>private String[] list;
⚠️ 注意:YAML 中必须是纯字符串列表;若含空格或特殊字符,建议加引号(如 - "item with space")。
@Value 读取 List 或 Set(需 SpEL)
要注入为 List<string></string> 或 Set<string></string>,必须用 SpEL 的 #{...} 并调用 split() 或 Arrays.asList():
- 读取为
List<string></string>:@Value("#{${my.list} != null ? ${my.list} : ''}") private List<string> list;</string>
(前提是 YAML 是逗号分隔字符串,如my.list: a,b,c) - 更通用方式(推荐):YAML 写成多行列表,Java 侧用
@Value("#{@environment.getProperty('my.list', String.class).split(',')}"——但此法依赖环境变量解析,略绕 - 实际更稳妥的做法是用
@ConfigurationProperties绑定对象(见下文)
推荐替代方案:@ConfigurationProperties(更安全)
对于数组、集合、嵌套对象等结构化配置,@ConfigurationProperties 比 @Value 更健壮、类型安全、支持校验:
@ConfigurationProperties(prefix = "my")<br>public class MyConfig {<br> private List<string> list = new ArrayList();<br> // getter/setter<br>}</string>
对应 YAML:
my:<br> list:<br> - hello<br> - world
启用方式:主类加 @EnableConfigurationProperties(MyConfig.class) 或声明 @Bean。
不复杂但容易忽略:@Value 对集合的支持有限,强依赖 SpEL 和字符串格式;生产项目优先用 @ConfigurationProperties 处理结构化配置。











