yml文件里的数组使用 @Value || @ConfigurationProperties

本文探讨了如何在Spring Boot中使用yml数组配置上传路径,并利用SpEL动态获取和处理配置。作者分享了配置类和@Value注解的区别,以及如何通过@ConfigurationProperties灵活获取复杂对象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

最近有个功能突然有个需求,需要在yml配置文件里配置多条路径,需要动态获取配置文件里的参数,根据接口接收的参数判断,使用对应的配置

就了解到yml数组,遂记录

一、 yml数组形式

upload-record-paths:
  basepath: filerecord
  list:
    - name: 111
      path: 111
    - name: 222
      path: 222

其中对象对应Java元素结构为map,一个 “ - ” 代表一组,整体是一个List,因为@Value不支持取复杂对象且限制较多,除了一个值一个值的取,只能使用SpEL(后文有解释),所以我使用配置类的方式

二、配置类取对象

@Configuration
@ConfigurationProperties(prefix = "upload-record-paths")
@Data
public class UploadRecordProperties {
    public static List<Map<String, String>> list;   //static 才能拿配置值
}

其中upload-record-paths为yml配置文件前缀,使用也很简单,代码中直接

// 动态获取配置文件 - 或者使用@Autowried注入配置对象,通过get获取
List<Map<String, String>> list = UploadRecordProperties.getList();

String path = null;
    for (Map map : list){
          String name = (String) map.get("name");
          if (name.equalsIgnoreCase(fileType)){
              path = recordbasepath + File.separator + (String) map.get("path") + File.separator + rocordId;
          }
      }
      if (StringUtils.isBlank(path)){
          // 没有对应类型
          return ResponseEntityResult.error("没有找到匹配的文件类型:" + fileType);
      }

大概是以上流程。

我个人有个参考使用方式可取出

@Value("#{'${com.xxx.xxx-list:}'.empty ? null : '${com.xxx.xxx-list:}'.split(',')}")
    private List<String> list;

对应的yml格式为

# 通过,分隔使用的参数
com:
	xxx:
		xxx-list: 
	.dwt,.dwg,.dxf,.zip,.rar,.mxd

文章发布一个月后,发现了一个博主的好文章解释了为啥能这样,晒这

[@value 数组_SpringBoot @Value 读取配置,太强大了!](文章发布一个月后,发现了一个博主的好文章,晒这,能不使用配置类使用
@value 数组_SpringBoot @Value 读取配置,太强大了!

三、SpEL

前面说到@Value取值限制较多,这是因为除了正常的一个个参数使用$获取,就只剩下SpEL的方式了。
首先看看使用@Value和@ConfigurationProperties配置类的方式有什么不同

图片来自参考文章
图片来自参考文章

我们可以看出使用@ConfigurationProperties配置类比@Value支持的方法多,其中松散绑定是

比如说有个yml参数是 file-upload
在配置类中可以写成file-upload或者fileUpload

其他几种可以查看参考材料里的文章了解。

四、参考材料

这是第三部分的参考文章:spring boot 配置文件properties,yml语法学习及属性获取@ConfigurationProperties和@Value

### 使用 `@Value` 注解解析数组 在 Spring Boot 中,可以通过 `@Value` 注解来注入来自配置文件数组或集合。这使得应用程序可以根据外部化配置灵活调整行为。 #### 配置文件设置 为了使 `@Value` 能够正确解析数组,在配置文件(如 `application.properties` 或者 `application.yml`)中定义键值对时,应该按照特定格式书写: 对于 `.properties` 文件: ```properties my.array=apple,banana,cherry ``` 对于 `.yml` 文件: ```yaml my: array: ["apple", "banana", "cherry"] ``` #### Java 类中的实现方式 下面是一个简单的例子展示如何利用 `@Value` 来接收并处理字符串类型的数组[^4]。 ```java import org.springframework.beans.factory.annotation.Value; import java.util.Arrays; public class MyComponent { @Value("#{'${my.array}'.split(',')}") private List<String> myArray; public void printMyArray() { System.out.println(Arrays.toString(myArray.toArray())); } } ``` 这段代码展示了怎样把逗号分隔符形式的字符串转换成列表的形式存储于成员变量 `myArray` 中。注意这使用了 SpEL (Spring Expression Language) 表达式来进行分割操作。 另外一种更简洁的方法是在较新的版本直接指定类型为 `List<T>` 并省去显式的拆分逻辑: ```java import org.springframework.beans.factory.annotation.Value; import java.util.List; public class AnotherComponent { @Value("${my.array}") private List<String> fruits; // getter and setter methods... } ``` 这种方式下框架会自动完成必要的转化工作而无需开发者额外干预。 #### 处理复杂数据结构的情况 当面对更加复杂的场景比如多维数组或者其他非基本类型组成的序列时,推荐采用 `@ConfigurationProperties` 进行批量映射,因为其提供了更好的灵活性和支持度[^3]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值