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

 更新时间:2021年12月16日 09:35:11   作者:KinYang_Lau  
这篇文章主要介绍了SpringBoot读取yml文件中配置数组的2种方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

一直都在用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;
/**
 * @author KinYang.Lau
 * 用于读取 yml 类型的文件
 * @date 2020/9/26 7:06 下午
 */
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默认情况下会以“,”进行分割,转换成对应的数组或列表。

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java  Super 用法详解及实例代码

    java Super 用法详解及实例代码

    这篇文章主要介绍了java Super 用法详解及实例代码的相关资料,需要的朋友可以参考下
    2017-03-03
  • 解决java.sql.SQLException: validateConnection false问题的方法汇总(最全)

    解决java.sql.SQLException: validateConnection false问题的方法汇总(最

    这篇文章主要给大家介绍了关于解决java.sql.SQLException: validateConnection false问题的方法汇总,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-03-03
  • SpringCloud实战之Zuul网关服务

    SpringCloud实战之Zuul网关服务

    服务网关是分布式架构中不可缺少的组成部分,是外部网络和内部服务之间的屏障。这篇文章主要介绍了SpringCloud实战之Zuul网关服务。一起跟随小编过来看看吧
    2018-05-05
  • shiro整合springboot前后端分离

    shiro整合springboot前后端分离

    这篇文章主要介绍了shiro整合springboot前后端分离,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-12-12
  • java语言实现权重随机算法完整实例

    java语言实现权重随机算法完整实例

    这篇文章主要介绍了java语言实现权重随机算法完整实例,具有一定借鉴价值,需要的朋友可以参考下。
    2017-11-11
  • spring解决循环依赖的方案示例

    spring解决循环依赖的方案示例

    这篇文章主要介绍spring如何解决循环依赖,文中有相关的代码示例给大家参考,对我们的学习或工作有一定的帮助,感兴趣的同学可以借鉴阅读
    2023-05-05
  • java中TestNG使用教程详解

    java中TestNG使用教程详解

    TestNG是Java中的一个测试框架, 类似于JUnit 和NUnit, 本文主要介绍了java中TestNG使用教程详解,具有一定的参考价值,感兴趣的可以了解一下
    2021-12-12
  • 浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    浅谈Java中的重载,重写,多态,静态绑定、动态绑定

    这篇文章主要介绍了浅谈Java中的重载,重写,多态,静态绑定、动态绑定,具有一定借鉴价值
    2018-01-01
  • 简单了解Spring IoC相关概念原理

    简单了解Spring IoC相关概念原理

    这篇文章主要介绍了简单了解Spring IoC相关概念原理,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • Java中的单例模式详解(完整篇)

    Java中的单例模式详解(完整篇)

    Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显,下面这篇文章主要给大家介绍了关于Java中单例模式的相关资料,需要的朋友可以参考下
    2021-11-11

最新评论