介绍两种SpringBoot读取yml文件中配置数组的方法

2023-11-07

一直都在用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默认情况下会以“,”进行分割,转换成对应的数组或列表。 感谢@丁乾文小伙伴的指出问题。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

介绍两种SpringBoot读取yml文件中配置数组的方法 的相关文章

随机推荐

  • 从汇编分析函数调用堆栈详细过程

    前言 首先来说 我们今天的学习并不是为了学习汇编语言 而是为了更好地分析一些问题的底层原理 进入正题 首先由下面简单的代码我们来考虑两个问题 1 main函数调用sum sum执行完以后 怎么知道回到哪个函数中 2 sum函数执行完 回到m
  • STM32的SYSTICK详解

    什么是SysTick 这是一个24位的系统节拍定时器system tick timer SysTick 具有自动重载和溢出中断功能 所有基于Cortex M3处理器的微控制器都可以由这个定时器获得一定的时间间隔 SysTick作用 在单任务
  • Unity 利用AES给文件加密与解密

    using System using System Collections using System Collections Generic using System IO using System Security Cryptograph
  • OpenStack H版发布

    根据官方发布的消息 OpenStack 2013 2 代号Havana 最终版已经发布 除了增加OpenStack Metering Ceilometer 和OpenStack Orchestration Heat 两个新组件外 还完成了4
  • python3-关于GitHub的最基本操作

    阅读目录 介绍 什么是GitHub 创建存储库 创建一个分支 做一个提交 打开拉取请求 合并拉取请求 一 介绍 Hello World项目是计算机编程历史悠久的传统 这是一个简单的练习 可以让你在学习新东西时开始学习 让我们开始使用GitH
  • DB2检查死锁和解锁的命令(AIX系统)

    在交易量比较大的系统上经常由于程序原因或者数据库配置参数不当导致死锁发生 在交易高峰期 检查易发生死锁的表就很有必要 常用命令如下 1 检查监视器开关是否打开 db2 get monitor switches 如果锁定信息中
  • ajax上传form表单(type='file')FormData

    一般上传表单的时候有两种方式 1 form表单内实现 指定action和 method form标签内添加一个submit的button 点击submit实现上传功能 对任何的形式的input都可以 2 Ajax实现上传 一般情况下我们都会
  • 剑指offer 学习笔记 二叉搜索树的后序遍历序列

    面试题33 二叉搜索树的后序遍历序列 输入一个整数数组 判断该数组是不是某二叉搜索树的后序遍历结果 只要存在一个二叉搜索树的后序遍历结果为它即可 如果是返回true 不是返回false 假设输入数组的任意两个数字都不相同 后序遍历得到的序列
  • 《Python进阶系列》十: 整理文件和目录最最最常用的os模块

    盘一盘Python中的os模块 os模块是Python标准库中整理文件和目录最为常用的模块 该模块提供了非常丰富的方法用来处理文件和目录 图来自 https www cnblogs com ltkekeli1229 p 15709442 h
  • RSS订阅无需代码连接Outlook的方法

    RSS订阅用户使用场景 一家专门做书籍测评的企业 其日常工作中需要收集豆瓣上最受欢迎的书籍进行测评 为了确保测评的准确性和客观性 团队成员需要定期在Outlook上创建会议讨论新书 从不同角度对书籍进行深入剖析 然而 在实际执行过程中 他们
  • 聊聊 220V交流 过零检测

    聊聊过零检测 以及如何实现过零检测 by 矜辰所致 增加测试结果 2023 6 20 目录 前言 一 什么是过零检测 1 1 为何需要过零检测 二 如何做过零检测 2 1 光耦 2 2 比较器 运放 2 3 三极管 MOS管 2 4 过零检
  • 两个序列中位数算法c语言,PAT 2-13 两个有序序列的中位数(C语言实现)

    题目描述 已知有两个等长的非降序序列S1 S2 设计函数求S1与S2并集的中位数 有序序列A0 A1 AN 1的中位数指A N 1 2的值 即第 N 1 2 个数 A0为第1个数 输入格式说明 输入分3行 第1行给出序列的公共长度N 0 输
  • [DirectX][DirectInput][JoyStick]DirectInput的JoyStick创建步骤整理

    简介 DirectInput和其他DirectX组成部分一样 是通过硬件抽象层 HAL 和硬件仿真层 HEL 来实现 处理的输入设备一般包括鼠标 键盘 游戏控制杆 操作杆等 而且现在的DirectInput还能够支持力反馈设备 Step 1
  • MyBatis-Plus是什么?为什么用?怎么用?

    1 MyBatis Plus是什么 官方是这样定义的 Mybatis Plus 简称MP 是一个 Mybatis 的增强工具 在 Mybatis 的基础上只做增强不做改变 为简化开发 提高效率而生 所谓的增强 就是已经封装好了一些crud
  • 方舟服务器维护为什么要藏好,方舟生存进化开服常见问题及解决方法

    印痕技能隐藏代码 OverrideNamedEngramEntries EngramClassName 印痕代码 EngramLevelRequirement 1 EngramPointsCost 1 EngramHidden True R
  • 怎么让照片变年轻_如何使照片中的人物变的年轻(在Ps中调节的)?

    1 打开素材 按ctrl j三次 复制三次背景 选中图层1 将混合模式设置为柔光 不透明度为15 2 选中图层1副本 混合模式设置为柔光 选择 滤镜 模糊 高斯模糊 半径为4 5像素 确定 3 选中图层1副本2 混合模式设置为柔光 不透明度
  • 分布式数据库架构

    分布式数据库架构 1 MySQL常见架构设计 对于mysql架构 一定会使用到读写分离 在此基础上有五种常见架构设计 一主一从或多从 主主复制 级联复制 主主与级联复制结合 1 1 主从复制 这种架构设计是使用的最多的 在读写分离的基础上
  • SQL中UPDATE更新语句、REPLACE()替换函数

    更新 替换 1 UPDATE 2 replace 1 UPDATE 语法 update lt 表名 gt set lt 列名 gt lt 表达式 gt 用法 quad quad 更改数据表中的数据 1 将登记日期更新为 2009 10 10
  • c语言文件尾没有newline字符,关于C++:”文件末尾无新行”编译器警告“No newline at end of file”...

    在某些C 编译器中 下面的警告是什么原因 No newline at end of file 为什么在源文件 头文件的末尾应该有一个空行 不完全是因为这个原因 但是如果您使用cx1 0 文件 并且它没有尾随新行 因为新的shell提示将出现
  • 介绍两种SpringBoot读取yml文件中配置数组的方法

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