百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

Spring Boot中通过@PropertySource注解读取yaml或yml配置文件

liuian 2025-02-09 13:14 37 浏览

一、@PropertySource注解

@PropertySource加载指定的配置文件。

将一切配置全部写在全局配置文件中,是不可想象的。项目中不可避免存在多个配置文件。

@PropertySource 可以根据需要加载指定的配置文件,将配置文件中的属性注入到系统环境中。@ConfigurationProperties 默认从全局配置文件获取配置。

这里将person的属性配置单独写在person.yml文件中,并从全局配置文件中注释掉person的属性配置。

因为yaml语法很简洁,写yaml配置文件也比较方便。

通过@PropertySource注解读取配置文件的属性,进行映射,习惯上用properties配置文件是没问题的。但是,换成yaml文件,发现都读取不到属性值。

这是因为@PropertySource默认不支持yaml读取,我们改成@Value注解也是可以读取的,不过属性一堆的话,一个一个读取也是很繁琐的。不过,可以通过自定义开发来实现对yaml配置文件的支持。



二、为什么@PropertySource 注解默认不支持yaml配置文件?

下面简单分析一下源码。

1. @PropertySource 源码

根据上面的注释,默认使用
DefaultPropertySourceFactory类作为资源文件加载类。

进一步调用Spring框架底层的PropertiesLoaderUtils工具类进行读取资源文件。

然后调用
DefaultPropertiesPersister的load方法:


最终加载配置文件的方法,就是下面的load0()方法。

从源码可以看出,这个方法是一行一行地读取,然后根据冒号、等于号、空格等进行校验,经过一系列遍历之后获取key和value,而yaml语法是以缩进来辨别的,这个方法不支持yaml文件的读取。


三、自定义yaml配置文件读取的工厂类

模仿
DefaultPropertySourceFactory写一个yaml配置文件读取的工厂类。

完整代码如下所示:

package com.rickie.springboot.core;


import org.springframework.boot.env.YamlPropertySourceLoader;

import org.springframework.core.env.PropertiesPropertySource;

import org.springframework.core.env.PropertySource;

import org.springframework.core.io.support.EncodedResource;

import org.springframework.core.io.support.PropertySourceFactory;


import java.io.IOException;

import java.util.List;

import java.util.Optional;

import java.util.Properties;


public class YmlPropertyResourceFactory implements PropertySourceFactory {


@Override

public PropertySource createPropertySource(String name, EncodedResource encodedResource) throws IOException {

String resourceName = Optional.ofNullable(name).orElse(encodedResource.getResource().getFilename());


if(resourceName.endsWith(".yml") || resourceName.endsWith(".yaml")) {

List> yamlSources = new YamlPropertySourceLoader().load(resourceName, encodedResource.getResource());

return yamlSources.get(0);

} else {

return new PropertiesPropertySource(resourceName, new Properties());

}

}

}



四、编写Person类和person.yml 配置文件

写个bean类进行属性映射,注意替换一下默认的factory参数,factory =
YmlPropertyResourceFactory.class。


@Component组件

注入Spring容器,只有Spring容器中的组件才能使用@ConfigurationProperties功能;


@PropertySource(value = "classpath:person.yml",encoding = "utf-8",factory = YmlPropertyResourceFactory.class)

加载指定的配置文件;获取的是person.properties 这个配置文件下的配置信息;

factory =
YmlPropertyResourceFactory.class 设置使用自定义的配置文件读取的工厂类;


@ConfigurationProperties(prefix = "person")

告诉SpringBoot将本类中的相关配置与yml文件中的配置绑定,并获取配置前缀person下的配置项。


下面是person.yml 配置文件,同时将application.yml 中的person配置项注释掉。



五、测试验证

编写单元测试类,进行测试验证。

测试结果如下所示 :



六、扩展PropertyResourceFactory 工厂类

如果既要支持原来的yml,又要支持properties,就可以将PropertyResourceFactory类进行改写一下。

package com.rickie.springboot.core;


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 org.springframework.core.io.support.PropertySourceFactory;

import org.springframework.lang.Nullable;


import java.io.IOException;

import java.util.List;

import java.util.Optional;


public class CommonPropertyResourceFactory implements PropertySourceFactory {

/**

* Create a {@link PropertySource} that wraps the given resource.

*

* @param name the name of the property source

* @param resource the resource (potentially encoded) to wrap

* @return the new {@link PropertySource} (never {@code null})

* @throws IOException if resource resolution failed

*/

@Override

public PropertySource createPropertySource(@Nullable String name, EncodedResource resource) throws IOException {

String resourceName = Optional.ofNullable(name).orElse(resource.getResource().getFilename());

if (resourceName.endsWith(".yml") || resourceName.endsWith(".yaml")) {

List> yamlSources = new YamlPropertySourceLoader().load(resourceName, resource.getResource());

return yamlSources.get(0);

} else {

return new DefaultPropertySourceFactory().createPropertySource(name, resource);

}

}

}

这个类就可以支持原来的properties文件,也可以支持yml文件。

调用的时候,要改一下factory参数:

@PropertySource(value = "classpath:person.yml",encoding = "utf-8",factory = CommonPropertyResourceFactory.class)


还可以编写Rest方法进行验证,如下所示:

运行时返回JSON信息如下所示:

相关推荐

口碑最好的随身wifi品牌(随身wifi十大排名)

哪个牌子最好用性价比最高一目了然!格行设备价格:69/99/109/139/168(性价比高)芯片:进口马维尔芯片套餐:双网设备,套餐价格一致,随用随充续航:3000毫安18小时左右 33...

新买的台式电脑没声音(新买的台式机没有声音)

解决方法如下:1、查看主板的声卡驱动装没装上。2、驱动装好了,在右下角的小喇叭有没有,如果有,鼠标放在上面,右击就会看到声音的各种设置,如果没看到小喇叭,进入设备管理器看一下声音的硬件上是否有黄色标记...

dlink路由器设置密码步骤(dlink路由器设置教程)
  • dlink路由器设置密码步骤(dlink路由器设置教程)
  • dlink路由器设置密码步骤(dlink路由器设置教程)
  • dlink路由器设置密码步骤(dlink路由器设置教程)
  • dlink路由器设置密码步骤(dlink路由器设置教程)
三星笔记本u盘启动快捷键(三星笔记本u盘启动设置)

开机出现“SAMSUNG”画面时按F2进入BIOS设置,找到【Advanced】选项下,将快速启动“FastBIOSMode”项选为“Off”2.按F10键保存退出并重启,插入U盘,再次按F2键进入B...

普联无线路由器设置(普联路由器上网设置)

关于这个问题,以下是普联无线路由器的设置步骤:1.首先,将您的普联无线路由器与电脑或笔记本电脑连接。2.打开您的浏览器,输入路由器的IP地址(通常为192.168.1.1或192.168...

光盘映像文件怎么打开运行(光盘映像文件是干嘛的)
  • 光盘映像文件怎么打开运行(光盘映像文件是干嘛的)
  • 光盘映像文件怎么打开运行(光盘映像文件是干嘛的)
  • 光盘映像文件怎么打开运行(光盘映像文件是干嘛的)
  • 光盘映像文件怎么打开运行(光盘映像文件是干嘛的)
万兴数据恢复专家免费版(万兴数据恢复专家app)

手机版本目前还在开发当中,目前只有电脑版本跟网页版万兴数据管家,非常靠谱!这是一款专门针对苹果微信数据管理的软件,能够恢复苹果手机聊天记录、聊天记录备份、聊天记录导出!支持微信免费备到本地电脑,包括聊...

笔记本电脑怎么打开摄像头功能

看你的情况是,笔记本自带摄像头吧!如果是的话,只要和别人用通讯工具(支支视频,比如qqskype)聊天时,都可以自动打开!如果想单纯的自拍,打开“我的电脑”认真看,有一个选项(除了硬盘分区、光驱之外)...

w7主题设置(w7怎么换主题)

1、打开win7系统电脑左下角“开始”菜单,找到【控制面板】点击打开;2、进入控制面板界面,右上方【查看方式】更改为“小图标”,然后找到【管理工具】打开;3、进入“管理工具”,点击打开【服务】选项;4...

显卡温度多少正常范围(显卡温度一般在什么范围合理)
显卡温度多少正常范围(显卡温度一般在什么范围合理)

1、正常情况下显卡的温度是在30至85这个区间。2、如果是天气热一点的话,保持在50至85也是属于正常的。3、如果电脑在玩着大型游戏,显卡温度达到90以上都是有可能的。4、但如果你的显卡温度超过95度的话,就要注意一下了,这个时候可以保持室...

2026-01-03 01:55 liuian

惠普1008打印机驱动安装教程

首先,你可以从惠普官网下载最新的驱动程序并解压缩。接下来,双击解压后的驱动文件并跟随提示完成安装。如果你遇到任何问题,可以尝试用管理员权限运行安装程序或尝试重新启动电脑后再次安装驱动。最后,检查设备管...

惠普打印机官方售后维修服务中心

郑州市金水区文化路82硅谷广场B座1303室营业时间:周一至周日9:00-18:00支持品牌:惠普支持产品:笔记本电脑,台式机,显示器维修项目:不开机,死机重启,清理除尘,数据恢复等郑州市黄河南街与同...

全部游戏大全免费安装(全部游戏免费软件)
  • 全部游戏大全免费安装(全部游戏免费软件)
  • 全部游戏大全免费安装(全部游戏免费软件)
  • 全部游戏大全免费安装(全部游戏免费软件)
  • 全部游戏大全免费安装(全部游戏免费软件)
电脑怎么安装win10装系统(电脑怎么安装win10装系统按哪个键)

Windows10系统安装教程如下:准备好所需的文件和文件夹,包括安装介质(例如安装光盘、USB闪存驱动器或网络安装介质),以及需要包含Windows10镜像文件的文件和文件夹...

国内哪个ai写代码最强(ai用什么代码编程)

是的,coloros小布ai可以写代码。它具有图灵完备的编程能力,并且可以通过编程语言进行逻辑推理和计算,实现各种功能。通过编程,可以让coloros小布ai执行特定的任务、完成复杂的计算和处理数据,...