欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-09 16:32:53
目录从yaml文件读取内容映射为mapspring框架中的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"));
    }
}

打印

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

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