使用Spring从YAML文件读取内容映射为Map方式
从yaml文件读取内容映射为map
如何在spring boot中从yaml文件注入到map。
首先,将对spring框架中的yaml文件有一些了解。 然后,通过一个实际示例展示如何将yaml属性绑定到map。
spring框架中的yaml文件
使用yaml文件存储外部配置数据是一种常见的做法。 基本上,spring支持使用yaml文档作为属性的替代方法,并在后台使用snakeyaml对其进行解析。
看看典型的yaml文件是什么样的:
server: port: 8090 application: name: myapplication url: http://myapplication.com
从上面可以看出,yaml文件是不言自明的,更易于阅读。 实际上,yaml提供了一种简洁的方式来存储分层配置数据。
默认情况下,spring boot在应用程序启动时从application.properties或application.yml读取配置属性。 但是,我们可以使用@propertysource加载自定义的yaml文件。
既然熟悉了什么是yaml文件,看看如何在spring boot中将yaml属性作为map注入。
从yaml文件内容注入map
spring boot通过提供一个方便的注解@configurationproperties,将数据的外部化提升到了一个新的水平。 引入此注解是为了轻松地将配置文件中的外部属性直接注入java对象。
接下来将介绍如何使用@configurationproperties注解将yaml属性绑定到bean类中。
首先,在application.yml中定义一些键值属性:
server: application: name: injectmapfromyaml url: http://injectmapfromyaml.dev description: how to inject a map from a yaml file in spring boot config: ips: - 10.10.10.10 - 10.10.10.11 - 10.10.10.12 - 10.10.10.13 filesystem: - /dev/root - /dev/md2 - /dev/md4 users: root: username: root password: rootpass guest: username: guest password: guestpass
其次,创建一个bean类mapserverproperties来封装将配置属性绑定到maps的逻辑:
@configuration @configurationproperties(prefix = "server") @data public class mapserverproperties { private map<string, string> application; private map<string, list<string>> config; private map<string, credential> users; @data public static class credential { private string username; private string password; } }
如上面所见,我们用@configurationproperties装饰了mapserverproperties类。 这样,告诉spring将具有指定前缀的所有属性映射到mapserverproperties的对象。
测试
@runwith(springrunner.class) @springboottest public class mapfromyamlintegrationtest { @autowired private mapserverproperties mapserverproperties; @test public void whenyamlfileprovidedtheninjectsimplemap() { assertthat(mapserverproperties.getapplication()) .containsonlykeys("name", "url", "description"); assertthat(mapserverproperties.getapplication() .get("name")).isequalto("injectmapfromyaml"); } @test public void whenyamlfileprovidedtheninjectcomplexmap() { assertthat(mapserverproperties.getconfig()).hassize(2); assertthat(mapserverproperties.getconfig() .get("ips") .get(0)).isequalto("10.10.10.10"); assertthat(mapserverproperties.getusers() .get("root") .getusername()).isequalto("root"); } }
@configurationproperties与@value
快速比较@configurationproperties和@value。
尽管两个注解均可用于从配置文件注入属性,但它们却大不相同。 这两个注释之间的主要区别在于,每个注释具有不同的用途。
简而言之,@value允许我们通过键直接注入特定的属性值。 但是,@configurationproperties批注将多个属性绑定到特定对象,并提供通过映射对象对属性的访问。
通常,在注入配置数据时,spring建议在@value上使用@configurationproperties。 @configurationproperties提供了一种在结构化对象中集中和分组配置属性的好方法,以后我们可以将其注入其他bean。
配置文件yml中的map形式
yml中的格式
tes: maps: {key1: 12,key2: 34}
或者
tes: maps: key1: 15 key2: 2
创建一个类
然后创建对应类型的字段(注意下这个类的那两个注释了的注解)
package com.etc.lzg; import lombok.data; import org.springframework.boot.context.properties.configurationproperties; import org.springframework.context.annotation.configuration; import org.springframework.context.annotation.propertysource; import org.springframework.stereotype.component; import java.util.map; @data @component //@configuration //这个我这里虽然存在时能成功,不过我注释了也是可以的,这个是看网上有人写就跟着写上的 //@propertysource(value = {"classpath:/application.yml"}, encoding = "utf-8") //有的人是写了这个注解能成功,但是我这边不能有这个注解,有的话,就连编译都会报错 @configurationproperties(prefix = "tes") public class maptest { private map<string, string> maps; }
引用
package com.etc.lzg; import org.junit.test; import org.junit.runner.runwith; import org.springframework.beans.factory.annotation.autowired; import org.springframework.boot.test.context.springboottest; import org.springframework.test.context.junit4.springrunner; @runwith(springrunner.class) @springboottest public class lzgapplicationtests { @autowired private maptest maptest; @test public void contextloads() { system.out.println(maptest.tostring()); system.out.println("key1="+maptest.getmaps().get("key1")); } }
打印
以上为个人经验,希望能给大家一个参考,也希望大家多多支持。
上一篇: 在服务器上配置仅使用HTTPS通信的教程