使用Spring从YAML文件读取内容映射为Map方式

目录
  • 从YAML文件读取内容映射为Map
    • Spring框架中的YAML文件
    • 从YAML文件内容注入Map
    • @ConfigurationProperties与@Value
  • 配置文件yml中的map形式
    • yml中的格式
    • 创建一个类
    • 引用
    • 打印

从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"));
    }
}

打印

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

(0)

相关推荐

  • Spring中@Value读取properties作为map或list的操作

    Spring读取properties作为map: properties文件中: blog-top-links={home:"/home"} blog-list=1,2,3 map的写法和json差不多,但是应该不支持嵌套,没有尝试. key加不加引号都可以,value加双引号单引号都可以,但是当key中有"-"时就必须加引号,例如key为:about-me时,就必须加引号否则解析失败 list的写法和数组差不多,可以自定义分隔符,在java中分割即可 配置类中: @

  • Spring 配置文件字段注入到List、Map

    今天给大家分享冷门但是有很实小知识,Spring 配置文件注入list.map.字节流. list 注入 properties文件 user.id=3242,2323,1 使用spring el表达式 @Value("#{'${user.id}'.split(',')}") private List list; yaml 文件 在yml配置文件配置数组方式 number: arrays: - One - Two - Three @Value("${number.arrays}

  • 使用springboot配置文件yml中的map形式

    目录 springboot配置文件yml的map形式 1.yml中的格式 2.创建一个类 3.引用 4.打印 SpringBoot yaml文件map集合使用 yaml文件配置 配置文件对应的bean springboot配置文件yml的map形式 1.yml中的格式 tes: maps: {key1: 12,key2: 34} 或者 tes: maps: key1: 15 key2: 2 2.创建一个类 然后创建对应类型的字段(注意下这个类的那两个注释了的注解) package com.etc

  • 使用Spring从YAML文件读取内容映射为Map方式

    目录 从YAML文件读取内容映射为Map Spring框架中的YAML文件 从YAML文件内容注入Map @ConfigurationProperties与@Value 配置文件yml中的map形式 yml中的格式 创建一个类 引用 打印 从YAML文件读取内容映射为Map 如何在Spring Boot中从YAML文件注入到Map. 首先,将对Spring框架中的YAML文件有一些了解. 然后,通过一个实际示例展示如何将YAML属性绑定到Map. Spring框架中的YAML文件 使用YAML文

  • Python配置文件管理之ini和yaml文件读取的实现

    目录 1. 引言 2. 如何选择配置文件的格式 3. INI文件示例 4. YAML文件示例 5. 使用Cofigureparser读取ini文件 6. yaml文件读取示例 7. 总结 1. 引言 当我们设计软件时,我们通常会花费大量精力来编写高质量的代码.但这往往还不够,一个好的软件还应该考虑其整个系统,如测试.部署.网络等.其中最重要的一个方面是配置管理. 良好的配置管理应允许在任何环境中执行软件而不更改代码.最常见的配置包括数据库认证配置.部署服务器的主机名.动态参数等.在本文中,我想与

  • Python自动化测试中yaml文件读取操作

    什么是yaml 一种标记语言.yaml 是专门用来写配置文件的语言,非常简洁和强大 更直观,更方便,有点类似于json格式 yaml文件格式:test.yaml 安装yaml pip install pyyaml yaml基本语法规则 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 #表示注释,从这个字符一直到行尾,都会被解析器忽略,这个和python的注释一样 键值对(dict) yaml文件 user: ad

  • 使用Spring静态注入实现读取配置工具类新方式

    目录 Spring静态注入实现读取配置工具类 核心代码 拓展 Spring两种方式注入到静态工具类里 方式1 方式2:zs Spring静态注入实现读取配置工具类 Spring静态注入的核心首先是需要是一个Bean,才可以从Spring上下文中注入Bean,下例中environment是需要Autowired注入的Bean,之所以选择Environment是因为它有Spring已经加载好的属性配置,直接拿来用比从文件中读取更优雅,从文件中读取需要面临jar包外部配置问题,暂时未找到较好解决办法.

  • perl文件读取的几种处理方式小结

    1.单行(大文件处理): 复制代码 代码如下: my $oneline = <$FL> 或while($line=<H>){ } 2.读取全部(小文件处理): 复制代码 代码如下: open (my $in, "path ") or die "open error: $! "; my @lines = <$in> ; 3.读3行(大文件及特殊处理需要): 复制代码 代码如下: open (my $in, "path &q

  • Python读取yaml文件的详细教程

    yaml简介 1.yaml [ˈjæməl]: Yet Another Markup Language :另一种标记语言.yaml 是专门用来写配置文件的语言,非常简洁和强大,之前用ini也能写配置文件,看了yaml后,发现这个更直观,更方便,有点类似于json格式.在自动化测试用的相当多所以需要小伙伴们要熟练掌握 2.yaml基本语法规则: 大小写敏感 使用缩进表示层级关系 缩进时不允许使用Tab键,只允许使用空格. 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可 #表示注释,从这个字符

  • Python学习之yaml文件的读取详解

    目录 yaml 文件的应用场景与格式介绍 yaml 文件的应用场景 yaml 文件的格式 第三方包 - pyyaml 读取 yaml 文件的方法 yaml文件读取演示案例 yaml 文件的应用场景与格式介绍 yaml 文件的应用场景 yaml其实也类似于 json.txt ,它们都属于一种文本格式.在我们的实际工作中, yaml 文件经常作为服务期配置文件来使用. 比如一些定义好的内容,并且不会修改的信息,我们就可以通过定义 yaml 文件,然后通过读取这样的文件,将数据导入到我们的服务中进行使

  • Spring Boot读取配置文件内容的3种方式(@Value、Environment和@ConfigurationProperties)

    目录 前言 一.@Value 二.Environment 2.1 注入对象 2.2 调用获取属性的方法 2.3 上述两种方法对比 三.@ConfigurationProperties 3.1 创建一个实体类 3.2 解决警告问题 3.3 修改@ConfigurationProperties 3.4 编写测试代码 总结 前言 Spring Boot中在yaml中编写的自定义变量.数组.对象等,在代码中读取该yaml配置文件中内容的三种方式.实现在代码中运用配置文件(yaml)中自定义的值.yaml

  • python 读取yaml文件的两种方法(在unittest中使用)

    作者:做梦的人(小姐姐) 出处:https://www.cnblogs.com/chongyou/ python读取yaml文件使用,有两种方式: 1.使用ddt读取 2,使用方法读取ddt的内容,在使用方法中进行调用 1.使用ddt读取 @ddt.ddt class loginTestPage(unittest.TestCase):     @ddt.file_data(path)     @ddt.unpack     def testlogin(self,**kwargs):       

  • 详解Python读取yaml文件多层菜单

    需要用到的Python知识点 Python的对象属性方法: 用到字典{key:value}值的提取: 列表的增加: if循环结合break的使用: yaml文件读取: 代码如下: #!/usr/bin/python34 import sys,os,re,yaml,time #reload(sys) #sys.setdefaultencoding('utf-8') ######################对input输入字符类型判断并转化##################### def in

随机推荐