文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringBoot读取yml文件中配置数组的2种方法

2024-04-02 19:55

关注

一直都在用Spring的@Value注解读取yml中的配置,这两天在读取配置的时候,想读取yml中配置的一个数组,通过@Vaule一直获取不到,通过一番资料的查询,才彻底清楚了@Vaule的使用情况。

在Spring中读取配置文件的快捷方法常见的有两种,一个是通过@Vaule注解进行单一字段的注入,另外一种方法就是通过@ConfigurationProperties注解来进行批量注入。

@ConfigurationProperties注解属于SpringBoot,不在SpringFramework里面

这两种注入方式各有自己的优势和使用场景。

@Value @ConfigurationProperties
使用场景 单一属性注入,注解写在类的属性上 批量注入,注解写在类上
松散语法 不支持 支持
SpEL 支持 不支持
JSR303数据校验@Validated 不支持 支持
复杂类型封装(数组、Map、对象等) 不支持 (这么说不严谨) 支持

其实@Value可以注入任意类型对象,数组、Map、List、自定义对象等。

可以看我对@Value的注入过程进一步的分析

Spring的@Value可以注入复杂类型吗?今天教你通过@value注入自定义类型

yml配置文件:


test:
  list:
    - 'a'
    - 'b'
    - 'c'

数组、Map等都输入复杂类型封装,Value注解无法直接读取。

但是可以通过@ConfigurationProperties注解读取

通过@ConfigurationProperties注解读取

这里分为两种情况

1、读取的是配置在application.yml文件中的属性

只需要在类上加上注解就可以,配置好前缀


@Component
@ConfigurationProperties(prefix = "test")
public class TestYML {
 private String[] list;
 public void test(){
  System.out.println("list:"+list);
 }
 ///  set方法不能少
 public void setList(String[] list) {
  this.list = list;
 }
}

2、如果配置是在一个单独的yml文件中

例如 a.yml。那么此时还应该加上一个@PropertySource注解,指明来自哪个配置文件和一个Factory类


@Component
@PropertySource(value = {"classpath:a.yml"}, factory = YamlPropertySourceFactory.class)
@ConfigurationProperties(prefix = "test")
public class TestYML {
 private String[] list; 
 public void test(){
  System.out.println("list:"+list);  
 }
 ///  set方法不能少
 public String[] getList() {
  return list;
 }
}

import org.springframework.boot.env.YamlPropertySourceLoader;
import org.springframework.core.env.PropertySource;
import org.springframework.core.io.support.DefaultPropertySourceFactory;
import org.springframework.core.io.support.EncodedResource;
import java.io.IOException;
import java.util.List;

public class YamlPropertySourceFactory extends DefaultPropertySourceFactory {
 @Override
 public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
  if (resource == null) {
   return super.createPropertySource(name, resource);
  }
  List<PropertySource<?>> sources = new YamlPropertySourceLoader().load(resource.getResource().getFilename(), resource.getResource());
  return sources.get(0);
 }
}

同时还有注意,要有set方法!!!

通过@Value注解变相读取,曲线救国方案

因为@Value注解是支持SpEL表达式的,所以可以在yml配置文件中,把之前的数组形式改写为由字符串形式,例如“a.b.c”

yml文件内容


test:
  list: a.b.c

@Value("#{'${test.list}'.split('.')}")
private String[] list2;

这种方法是最简单的,不需要单独写一个类,不用set方法。

如果yml是单独的文件的话,只需要在类上添加@PropertySource(value = "classpath:a.yml")注解就行。

注意:

有小伙伴反映,@Value也可以直接注册数组或者结合。后来我测试了一下,发现当字符串是以,分割的时候,就可以注入数组或者其他集合。 Spring默认情况下会以“,”进行分割,转换成对应的数组或列表。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯