SpringBoot如何读取配置文件中的数据到map和list

目录
  • 读取配置文件中的数据到map和list
    • springboot读取配置文件中的配置信息到map
    • springboot读取配置文件中的配置信息到list
    • 测试上述配置是否有效
  • 配置文件的读取(包括list、map类型)
    • 读取配置文件
    • 第一种方式
    • 第二种方式
    • 扩展

读取配置文件中的数据到map和list

之前使用过@Value("${name}")来读取springboot配置文件中的配置信息,比如:

@Value("${server.port}")
private Integer port;

后面遇到一个新问题,如果我要把配置文件中的一系列数据一下子读出来到同一个数据结构中怎么办呢?

比如说读取配置信息到map或者list

下面来讲述一下如何实现这个功能。

springboot读取配置文件中的配置信息到map

首先看配置文件要读到map中的信息:

test:
  limitSizeMap:
    baidu: 1024
    sogou: 90
    hauwei: 4096
    qq: 1024

接着我们需要再maven的pom.xml文件中添加如下依赖:

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
  <optional>true</optional>
</dependency>

然后定义一个配置类,代码如下:

package com.eknows.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.HashMap;
import java.util.Map;
/**
 * 配置类
 * 从配置文件中读取数据映射到map
 * 注意:必须实现set方法
 * @author eknows
 * @version 1.0
 * @since 2019/2/13 9:23
 */
Configuration
ConfigurationProperties(prefix = "test")
EnableConfigurationProperties(MapConfig.class)
public class MapConfig {
    /**
     * 从配置文件中读取的limitSizeMap开头的数据
     * 注意:名称必须与配置文件中保持一致
     */
    private Map<String, Integer> limitSizeMap = new HashMap<>();
    public Map<String, Integer> getLimitSizeMap() {
        return limitSizeMap;
    }
    public void setLimitSizeMap(Map<String, Integer> limitSizeMap) {
        this.limitSizeMap = limitSizeMap;
    }
}

这样,我们就可以把配置文件中的数据以map形式读出来了,key就是配置信息最后一个后缀,value就是值。

测试代码请看文章最后。

springboot读取配置文件中的配置信息到list

首先看配置文件要读到list中的信息:

test-list:
  limitSizeList[0]: "baidu: 1024"
  limitSizeList[1]: "sogou: 90"
  limitSizeList[2]: "hauwei: 4096"
  limitSizeList[3]: "qq: 1024"

接着如上添加spring-boot-configuration-processor依赖项。

然后定义配置类,代码如下:

package com.eknows.config;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import java.util.ArrayList;
import java.util.List;
/**
 * 配置类
 * 从配置文件中读取数据映射到list
 * @author eknows
 * @version 1.0
 * @since 2019/2/13 9:34
 */
Configuration
@ConfigurationProperties(prefix = "test-list") // 不同的配置类,其前缀不能相同
@EnableConfigurationProperties(ListConfig.class) // 必须标明这个类是允许配置的
public class ListConfig {
    private List<String> limitSizeList = new ArrayList<>();
    public List<String> getLimitSizeList() {
        return limitSizeList;
    }
    public void setLimitSizeList(List<String> limitSizeList) {
        this.limitSizeList = limitSizeList;
    }
}

测试上述配置是否有效

编写测试类:

package com.eknows;
import com.eknows.config.ListConfig;
import com.eknows.config.MapConfig;
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;
import java.util.List;
import java.util.Map;
/**
 * @author eknows
 * @version 1.0
 * @since 2019/2/13 9:28
 */
@SpringBootTest
@RunWith(SpringRunner.class)
public class ConfigTest {
    @Autowired
    private MapConfig mapConfig;
    @Autowired
    private ListConfig listConfig;
    @Test
    public void testMapConfig() {
        Map<String, Integer> limitSizeMap = mapConfig.getLimitSizeMap();
        if (limitSizeMap == null || limitSizeMap.size() <= 0) {
            System.out.println("limitSizeMap读取失败");
        } else {
            System.out.println("limitSizeMap读取成功,数据如下:");
            for (String key : limitSizeMap.keySet()) {
                System.out.println("key: " + key + ", value: " + limitSizeMap.get(key));
            }
        }
        System.out.println("------");
        List<String> limitSizeList = listConfig.getLimitSizeList();
        if (limitSizeList == null || limitSizeList.size() <= 0) {
            System.out.println("limitSizeList读取失败");
        } else {
            System.out.println("limitSizeList读取成功,数据如下:");
            for (String str : limitSizeList) {
                System.out.println(str);
            }
        }
    }
}

运行测试类,发现控制台输出如下:

limitSizeMap读取成功,数据如下:
key: qq, value: 1024
key: baidu, value: 1024
key: sogou, value: 90
key: hauwei, value: 4096
------
limitSizeList读取成功,数据如下:
baidu: 1024
sogou: 90
hauwei: 4096
qq: 1024

配置文件的读取(包括list、map类型)

添加配置文件处理器的依赖,这样在编写配置文件的时候就会有提示了。

 <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-configuration-processor</artifactId>
            <version>2.1.3.RELEASE</version>
        </dependency>

有了依赖,可以直接使用application.properties文件为我们工作了,这是Springboot的默认文件,它会通过其机制读取到上下文中,这样就可以引用它了

读取配置文件

在使用maven项目中,配置文件会放在resources根目录下。

我们的springBoot是用Maven搭建的,所以springBoot的默认配置文件和自定义的配置文件都放在此目录。

springBoot的 默认配置文件为 application.properties 或 application.yml,这里我们使用 application.properties。

首先在application.properties中添加我们要读取的数据。

server.port = 8081
custom.name = lonewalker
custom.age = 18

第一种方式

我们可以通过@Value注解,这是Spring就有的,使用${...}占位符来读取配置在属性文件中的内容,既可以加在属性也可以加在方法上

import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
@Component
public class User {
    @Value("${custom.name}")
    private String name;
    private Integer age;
    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    @Value("${custom.age}")
    public void setAge(Integer age) {
        this.age = age;
    }
}

我们在测试环境试一下:

@SpringBootTest
class DemoApplicationTests {
    @Autowired
    User user;
    @Test
    void contextLoads() {
        System.out.println(user.getName());
        System.out.println(user.getAge());
    }
}

第二种方式

如果有很多我们就要写很多@Value,就会很麻烦,于是就有第二种方式

通过注解@ConfigurationProperties(prefix="配置文件中的key的前缀")可以将配置文件中的配置自动与实体进行映射,默认从全局配置文件中获取值。

@ConfigurationProperties("custom")这里的字符串database会和类中的属性名称组成全限定名去配置文件中查找

@Component
@ConfigurationProperties(prefix = "custom")
public class User {
    private String name;
    private Integer age;
getter()... setter()...
}

扩展

1、如何获取list数据

test.list=aaa,bbb,ccc

又该如何读取呢?

@SpringBootTest
class DemoApplicationTests {
    @Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}")
    private List<String> testList;
    @Test
    void contextLoads() {
      if (testList == null){
          System.out.println("empty");
      }else{
          for (String list:testList
               ) {
              System.out.println(list);
          }
      }
    }
}

首先这是一个EL表达式,${test.list:} 是为它加上默认值,但是这样有个问题,当不配置该 key 值,默认值会为空串,它的 length = 1,这样解析出来 list 的元素个数就不是空了

所以在此之前先判断一下是否为空,最终写成这样@Value("#{'${test.list:}'.empty ? null : '${test.list:}'.split(',')}") 就完美了,遍历的结果

2、如何获取map数据

test.map={name:"守约",force:"95"}

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

(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中分割即可 配置类中: @

  • Springboot yml Map List读取方式

    目录 Springboot yml Map List读取 1.配置类集中放置 2.配置类单独放置 3.List读取 4.问题:配置类没有获取到值 Springboot yml内list.map组合写法 Springboot yml Map List读取 Springboot 读取yml中的值作为参数,有2种写法: 例子: 已知有如下yml配置:   myapps:     1131f78c313e11e79da3000c298bdf0e: AMS系统     1ae211c543a14cf698

  • 使用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

  • springboot从application.properties中注入list, map方式

    目录 需求 直接上代码 配置类 测试类 application.properties配置注入出现错误 问题描述 需求 在配置类中,从application.properties中读取一个复杂list.如List<Person>或者初始化一个map 直接上代码 配置类 @Configuration @Component @ConfigurationProperties(prefix = "datahub") public class Config { private List

  • SpringBoot如何读取配置文件中的数据到map和list

    目录 读取配置文件中的数据到map和list springboot读取配置文件中的配置信息到map springboot读取配置文件中的配置信息到list 测试上述配置是否有效 配置文件的读取(包括list.map类型) 读取配置文件 第一种方式 第二种方式 扩展 读取配置文件中的数据到map和list 之前使用过@Value("${name}")来读取springboot配置文件中的配置信息,比如: @Value("${server.port}") private

  • SpringBoot读取properties或者application.yml配置文件中的数据

    读取application文件 在application.yml或者properties文件中添加: user.address=china user.company=demo user.name=让我康康 1.使用@Value注解读取 直接 代码如下: package im.homeapi.controller; import org.springframework.beans.factory.annotation.Value; import org.omg.CORBA.PUBLIC_MEMBE

  • springboot读取配置文件中的参数具体步骤

    springBoot是java开发中会经常用到的框架,那么在实际项目中项目配置了springBoot框架,应该如何在项目中读取配置文件中的参数呢? 1.打开eclipse开发工具软件. 2.在项目中确保pom.xml文件已引用了[spring-boot-starter-web]jar包. 因为springBoot启动的时候会自动去获取项目中在resources文件录目下的名为application.properties参数配置文件. 3.在项目中的src/main/resource文件录目下创建

  • SpringBoot从yml配置文件中读常用参数值实例方法

    SpringBoot现在基本上都是使用application-XXX.yml(生产环境为pro,开发测试环境为dev)来配置项目中的一些配置条件,在springboot中还可以通过从yml文件中将yml中的数据直接读取出来. 1.yml文件(这里设置参数的时候往往设置两层前缀,避免在调用的时候该属性中的部分参数名与计算机中的某些名字冲突) test: person: lastName: hello age: 18 boss: false birth: 2017/12/12 maps: {k1:

  • SpringBoot在yml配置文件中配置druid的操作

    最新版的druid和旧版在filter配置方面有些不同,以下是旧版druid中配置filter: spring: ##数据库连接信息 datasource: url: jdbc:mysql://localhost:3306/young username: root password: root driver-class-name: com.mysql.jdbc.Driver ###################以下为druid增加的配置########################### t

  • SpringBoot 常用读取配置文件的三种方法详解

    目录 前言 一.使用 @Value 读取配置文件 二.使用 @ConfigurationProperties 读取配置文件 1.类上添加@Configuration注解 2.使用@EnableConfigurationProperties注解 3.使用@ConfigurationPropertiesScan扫描 三.使用 Environment 读取配置文件 四.常用的几种数据结构配置读取 我们在SpringBoot框架进行项目开发中该如何优雅的读取配置呢?或者说对于一些List或者Map应该如

  • 浅谈SpringBoot主流读取配置文件三种方式

    读取配置SpringBoot配置文件三种方式 一.利用Bean注解中的Value(${})注解 @Data @Component public class ApplicationProperty { @Value("${application.name}") private String name; } 该方式可以自动读取当前配置文件appliation.yml  或者application.properties中的配置值 区别在于读取yml文件时候支持中文编码,peoperties需

  • 详解SpringBoot注解读取配置文件的方式

    一.@Value读取application.properties配置文件中的值 application.properties配置文件 fileName=configName PropertiesConfig类文件 import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Component; @Component public class PropertiesC

  • 如何使用ajax读取Json中的数据

    本文给大家分享一下,如何使用ajax读取Json中的数据. 一.基础知识 什么是json? JSON 指的是 JavaScript 对象表示法(JavaScript Object Notation) JSON 是轻量级的文本数据交换格式 JSON 独立于语言 * JSON 具有自我描述性,更易理解 JSON 使用 JavaScript 语法来描述数据对象,但是 JSON 仍然独立于语言和平台.JSON 解析器和 JSON 库支持许多不同的编程语言. JSON - 转换为 JavaScript 对

  • smarty模板引擎从配置文件中获取数据的方法

    本文实例讲述了smarty模板引擎从配置文件中获取数据的方法.分享给大家供大家参考.具体如下: 当某个变量值,不希望在程序中写死时,就可以把该变量写到配置文件里,并从中获取(常见的配置样式). 第一步:先写一个配置文件,如数据库的 db.conf,后缀名conf可以随便写,db.ini也行.文件中内容的格式需要固定:key="值",每一行后面不需要添加分号或者什么,直接回国换行,如: 配置文件:db.conf 复制代码 代码如下: host = "localhost"

随机推荐