You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 08:25:24