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

网友投稿 838 2022-09-09


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

目录通过@ConfigurationProperties注解读取1、读取的是配置在application.yml文件中的属性2、如果配置是在一个单独的yml文件中通过@Value注解变相读取,曲线救国方案

一直都在用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> 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;

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

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

注意:

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


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:6.9国际档案日|海泰方圆积极推动我国电子档案高质量发展
下一篇:因特网概述(因特网的基本概念和简单应用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~