Spring Boot中如何用@Value读取方括号格式的List配置?
解决方案
@Value注解本身并不直接支持你这种索引式(items[0])的配置格式注入为List<String>,因为这种方括号语法是@ConfigurationProperties的专属特性。不过可以通过以下两种方式实现需求:
方法一:使用SpEL表达式直接处理
通过SpEL获取Spring环境中的所有属性,过滤出目标前缀的属性并排序后收集为List:
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @Component public class YourComponent { @Value("#{#environment.getPropertyNames().stream()" + ".filter(name -> name.startsWith('items['))" + ".sorted(Comparator.comparingInt(name -> Integer.parseInt(name.substring(6, name.length() - 1))))" + ".map(name -> #environment.getProperty(name))" + ".collect(Collectors.toList())}") private List<String> items; // 测试用例 public void showItems() { items.forEach(System.out::println); } }
说明:
#environment是Spring内置的环境对象,可直接在SpEL中引用- 先过滤出所有以
items[开头的属性名 - 通过截取属性名中的索引数字进行排序,保证List顺序与配置一致
- 最后映射为属性值并收集成List
方法二:自定义属性辅助Bean(更易维护)
如果需要在多个地方复用该逻辑,可以封装一个辅助Bean,再通过SpEL调用:
1. 定义属性辅助类
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.core.env.Environment; import java.util.Comparator; import java.util.List; import java.util.stream.Collectors; @Configuration public class PropertyHelperConfig { @Bean public PropertyHelper propertyHelper(Environment environment) { return new PropertyHelper(environment); } public static class PropertyHelper { private final Environment environment; public PropertyHelper(Environment environment) { this.environment = environment; } public List<String> getIndexedList(String prefix) { return environment.getPropertyNames().stream() .filter(name -> name.startsWith(prefix + "[")) .sorted(Comparator.comparingInt(name -> { int start = prefix.length() + 1; int end = name.indexOf(']'); return Integer.parseInt(name.substring(start, end)); })) .map(environment::getProperty) .collect(Collectors.toList()); } } }
2. 在组件中使用
import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; import java.util.List; @Component public class YourComponent { @Value("#{propertyHelper.getIndexedList('items')}") private List<String> items; // 测试用例 public void showItems() { items.forEach(System.out::println); } }
说明:
- 该方式将索引式List的解析逻辑封装,可通过传入不同前缀(如
items、users)复用 - 同样保证了List的顺序与配置中的索引一致
内容的提问来源于stack exchange,提问作者Natasha
相关产品推荐
相关产品推荐

