SpringBoot解析yml/yaml/properties配置文件的四种方式汇总

2023-05-16

目录

一、配置文件注入方式一@Value

二、配置文件注入方式二@ConfigurationProperties

三、自定义解析类,直接暴力读取yml配置文件

四、Spring配置文件的解析类Environment获取式


一、配置文件注入方式一@Value

配置文件:

# 严格识别空格

# 属性(String/Byte/Short/Integer/Long/Float/Double/Character/Boolean)
properties:
  name1: 徐城和

# 数组/集合(Arrays/List/Set)
arrays:
  srr1: 小徐,小杨
  srr2: [小张,小林]

# 键值对(Map)
maps:
  map1: {key1: value1,key2: value2}

注入/解析类: 

package parseconfiguration;

import autowired.SubGenericityApplication;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Set;

/**
 * 配置文件注入方式一@Value
 * 
 * 其中,该注入方式:
 * -仅可注入单属性值和常规数组/集合写法,其它配置或写法需要使用方式二注入
 * -属性不需要Get/Set方法支持
 * -可以注入任意类型数据,自动转换注入
 * -没配置或无法识别或类型无法转换,均会导致配置失败,会报错,因此需要配合default默认值使用
 * 
 * @author Chenghe Xu
 * @date 2023/2/14 10:34
 */
@SpringBootTest(classes = SubGenericityApplication.class)
public class Test01 {
    
    @Value("${properties.name1}")
    private String name1;
    
    @Value("${arrays.srr1}")
//    private String[] srr1;
//    private List<String> srr1;
    private Set<String> srr1;
    
    @Test
    public void test1() {
        
        System.out.println("name1 = " + name1);
        
        System.out.print("srr1 = |");
        for (String s : srr1) {
            System.out.print(s + "|");
        }
        System.out.println();
                
    }
    
}

/**
 * 数组注入时会按英文逗号分割
 * 字符串不会
 */
@SpringBootTest(classes = SubGenericityApplication.class)
class Test01_1 {
    
    /**
     * 在生产环境,@Value防止没配置或注入失败,直接报错,需要配合default使用
     */
    @Value("${properties.name2:没配置,没默认值会直接报错}")
    private String name2;
    
    @Value("${arrays.srr2:无法识别,没默认值会直接报错}")
//    private String[] srr2;
//    private List<String> srr2;
    private Set<String> srr2;
    
    @Value("${maps.map1:类型无法转换,没默认值会直接报错}")
    private String map1;
    
    @Test
    public void test1() {
        
        System.out.println("name2 = " + name2);
    
        System.out.print("srr2 = |");
        for (String s : srr2) {
            System.out.print(s + "|");
        }
        System.out.println();
    
        System.out.println("map1 = " + map1);
    
    }
    
}

二、配置文件注入方式二@ConfigurationProperties

 配置文件:

# 严格识别空格
myproperties:

  # 属性(String/Byte/Short/Integer/Long/Float/Double/Character/Boolean)
  name1: 徐城和
  
  # 数组/集合(Arrays/List/Set)
  srr1: 小徐,小杨
  srr2: [小张,小林]
  srr3:
    - 小君
    - 小白
  
  # 键值对(Map)
  map1: {key1: value1,key2: value2}
  map2:
    key3: value3
    key4: value4
  
  # 对象(Object)
  pet1: {name: 旺财,age: 3}
  pet2: 
    name: 莉莉
    age: 2

注入/解析类: 

package parseconfiguration;

import autowired.SubGenericityApplication;
import lombok.Data;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.Map;
import java.util.Set;

/**
 * 配置文件注入方式二@ConfigurationProperties
 * 
 * 其中,该注入方式:
 * -需要配合启动类注解标记:@EnableConfigurationProperties({Test02.class})/@ConfigurationPropertiesScan({"parseconfiguration"})
 * -或配合注册为Bean:@Configuration/@Component,或再引入配置处理器依赖:spring-boot-configuration-processor
 * -属性需要Get/Set方法支持
 * -可以注入任意类型数据,自动转换注入
 * -无法识别或类型无法转换,会导致配置失败,会报错;没配置则不注入
 * 
 * @author Chenghe Xu
 * @date 2023/2/17 9:47
 */
@Data
//@Component
//@Configuration
@ConfigurationProperties("myproperties")
@SpringBootTest(classes = SubGenericityApplication.class)
public class Test02 {
    
    private String name1;
    
//    private String[] srr1;
//    private String[] srr2;
//    private String[] srr3;
//    private List<String> srr1;
//    private List<String> srr2;
//    private List<String> srr3;
    private Set<String> srr1;
    private Set<String> srr2;
    private Set<String> srr3;
    
    private Map<String, String> map1;
    private Map<String, String> map2;
    
    private Pet pet1;
    private Pet pet2;
    
    @Test
    public void test1() {
        
        System.out.println("name1 = " + name1);
        
        System.out.print("srr1 = |");
        for (String s : srr1) {
            System.out.print(s + "|");
        }
        System.out.println();
        
        System.out.print("srr2 = |");
        for (String s : srr2) {
            System.out.print(s + "|");
        }
        System.out.println();
        
        System.out.print("srr3 = |");
        for (String s : srr3) {
            System.out.print(s + "|");
        }
        System.out.println();
        
        System.out.print("map1 = |");
        map1.forEach((k, v) -> {
            System.out.print(k + "=");
            System.out.print(v + "|");
        });
        System.out.println();
        
        System.out.print("map2 = |");
        map2.forEach((k, v) -> {
            System.out.print(k + "=");
            System.out.print(v + "|");
        });
        System.out.println();
        
        System.out.println("pet1 = " + pet1);
        System.out.println("pet2 = " + pet2);
        
    }
    
}

@SpringBootTest(classes = SubGenericityApplication.class)
class Test02_1 {
    
    @Autowired
    private Test02 test02;
    
    @Test
    public void test1() {
        
        System.out.println("test02.getName1() = " + test02.getName1());
        
        System.out.println("test02.getSrr1() = " + test02.getSrr1());
        System.out.println("test02.getSrr2() = " + test02.getSrr2());
        System.out.println("test02.getSrr3() = " + test02.getSrr3());
    
        System.out.println("test02.getMap1() = " + test02.getMap1());
        System.out.println("test02.getMap2() = " + test02.getMap2());
    
        System.out.println("test02.getPet1() = " + test02.getPet1());
        System.out.println("test02.getPet2() = " + test02.getPet2());
    
    }
    
}

/**
 * @PostConstruct
 * 实现全局静态变量访问优化
 * -可以优化重复的@Autowired注解,直接静态访问
 */
@Component
class ConfigurationUtil {
    
    public static Test02 staticTest02;
    
    @Autowired
    public Test02 test02;
    
    @PostConstruct
    public void initialize() {
        System.out.println("==Spring容器启动时初始化该方法==");
        staticTest02 = this.test02;
    }
    
}

@SpringBootTest(classes = SubGenericityApplication.class)
class Test02_2 {
    
    @Test
    public void test1() {
        
        System.out.println("ConfigurationUtil.staticTest02.getName1() = " + ConfigurationUtil.staticTest02.getName1());
        
        System.out.println("ConfigurationUtil.staticTest02.getSrr1() = " + ConfigurationUtil.staticTest02.getSrr1());
        System.out.println("ConfigurationUtil.staticTest02.getSrr2() = " + ConfigurationUtil.staticTest02.getSrr2());
        System.out.println("ConfigurationUtil.staticTest02.getSrr3() = " + ConfigurationUtil.staticTest02.getSrr3());
        
        System.out.println("ConfigurationUtil.staticTest02.getMap1() = " + ConfigurationUtil.staticTest02.getMap1());
        System.out.println("ConfigurationUtil.staticTest02.getMap2() = " + ConfigurationUtil.staticTest02.getMap2());
        
        System.out.println("ConfigurationUtil.staticTest02.getPet1() = " + ConfigurationUtil.staticTest02.getPet1());
        System.out.println("ConfigurationUtil.staticTest02.getPet2() = " + ConfigurationUtil.staticTest02.getPet2());
        
    }
    
}

@Data
class Pet {
    
    private String name;
    private Integer age;
    
    @Override
    public String toString() {
        return "|name=" + name + "|age=" + age + '|';
    }
    
}

三、自定义解析类,直接暴力读取yml配置文件

 配置文件:

#####自定义解析类,直接暴力读取yml配置文件#####

# 属性(String/Byte/Short/Integer/Long/Float/Double/Character/Boolean)
properties.username1=大傻逼

# 数组/集合(Arrays/List/Set)
arrys.srr1=1,2,3,4,5
arrys.srr2=1.1,2.2,3.3,4.4,5.5

# 键值对(Map)
maps.map1.key1=vlaue1

# 对象(Object)
pets.pet1.name=小汪
pets.pet1.age=1

注入/解析类: 

package parseconfiguration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.core.io.ClassPathResource;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.StandardCharsets;
import java.util.Properties;

/**
 * 自定义解析类,直接暴力读取yml配置文件
 *
 * @author Chenghe Xu
 * @date 2023/2/17 15:48
 */
public class Test05 {
    
    public static void main(String[] args) {
//        Properties properties = ConfigurationReader.properties;
        Properties properties = ConfigurationReader.getProperties();
        
        System.out.print("properties = |");
        properties.forEach((k, v) -> {
            System.out.print(k + "=");
            System.out.print(v + "|");
        });
        System.out.println();
        
        System.out.println("properties.username1 = " + ConfigurationReader.getProperty("properties.username1"));
        System.out.println("arrys.srr1 = " + ConfigurationReader.getProperty("arrys.srr1"));
        System.out.println("arrys.srr2 = " + ConfigurationReader.getProperty("arrys.srr2"));
        System.out.println("maps.map1.key1 = " + ConfigurationReader.getProperty("maps.map1.key1"));
        System.out.println("pets.pet1.name = " + ConfigurationReader.getProperty("pets.pet1.name"));
        System.out.println("pets.pet1.age = " + ConfigurationReader.getProperty("pets.pet1.age"));
        
    }
    
}

class ConfigurationReader {
    
    private static final Logger LOGGER = LoggerFactory.getLogger(Test05.class);
    
//    public static Properties properties = new Properties();
    private static Properties properties = new Properties();
    
    public static Properties getProperties() {
        return properties;
    }
    
    public static String getProperty(String key){
        return properties.getProperty(key);
    }
    
    /**
     * static语句块的作用:
     * 由于static修饰的变量或语句块会在类被加载时,仅且执行一次
     * 所以可以进行调用方法初始化(静态)成员变量
     * 即可以通过访问类名访问静态成员变量或其Get方法
     */
    static {
        init();
    }
    
    public static void init() {
        InputStream inputStream = null;
        InputStreamReader inputStreamReader = null;
        BufferedReader bufferedReader = null;
        try {
            // 可解析多个配置文件
            String[] paths = {"application-Test05.properties"};
            for (String path : paths) {
                ClassPathResource resource = new ClassPathResource(path);
                // 处理中文乱码
                inputStream = resource.getInputStream();
//                inputStreamReader = new InputStreamReader(inputStream, "UTF-8");
//                inputStreamReader = new InputStreamReader(inputStream, "utf-8");
                inputStreamReader = new InputStreamReader(inputStream, StandardCharsets.UTF_8);
                bufferedReader = new BufferedReader(inputStreamReader);
//                properties.load(inputStreamReader);
                properties.load(bufferedReader);
            }
            // 关闭资源
            inputStream.close();
            inputStreamReader.close();
            bufferedReader.close();
            LOGGER.info("读取完成");
        } catch (IOException e) {
            LOGGER.error("无法读取配置文件");
        }
    }
    
}

四、Spring配置文件的解析类Environment获取式

 配置文件:

#####Spring配置文件的解析类Environment获取式#####
myproperties:
  es:
    index:
      type:
        documents:
          fields: 小徐001,小徐002,小徐003

注入/解析类:

package parseconfiguration;

import autowired.SubGenericityApplication;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.core.env.Environment;

/**
 * Spring配置文件的解析类Environment获取式
 *
 * @author Chenghe Xu
 * @date 2023/2/21 15:29
 */
@SpringBootTest(classes = SubGenericityApplication.class)
public class Test06 {
    
    // Spring配置文件的解析类
    @Autowired
    private Environment environment;
    
    @Test
    public void test1() {
        
        // 直接匹配获取
        String stringArrays01 = environment.getProperty("myproperties.es.index.type.documents.fields");
        System.out.println("stringArrays01 = " + stringArrays01);
    
        // 指定类型获取
        String[] arrays01 = environment.getProperty("myproperties.es.index.type.documents.fields", String[].class);
        System.out.print("arrays01 = |");
        for (String s : arrays01) {
            System.out.print(s + "|");
        }
        System.out.println();
    
        // 带默认值获取
        String stringArrays02 = environment.getProperty("myproperties.es.index.type.documents.fields01", "没有配置该属性");
        System.out.println("stringArrays02 = " + stringArrays02);
    
        // 综合类型和默认值
        String[] arrays02 = environment.getProperty("myproperties.es.index.type.documents.fields01", 
                String[].class, new String[]{"小徐004","小徐005","小徐006"});
        System.out.print("arrays02 = |");
        for (String s : arrays02) {
            System.out.print(s + "|");
        }
        System.out.println();
        
    }
    
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot解析yml/yaml/properties配置文件的四种方式汇总 的相关文章

随机推荐

  • 概念物理Ⅱ 第一讲:绪论

    目录 物理学研究的对象和动机为什么要研究物理学 xff1f 1 满足人类对大自然基本规律的好奇心2 改进技术 发展生产 两个动机之间的关系 物理学的发展历史起源于古希腊古典物理学时间 xff1a 牛顿时代 1900年经典力学 xff08 牛
  • Machine Learning:k近邻算法(KNN)

    目录 写在前面的话k 近邻算法概述优点缺点适用数据范围 原理Python代码实现Sklearn直接调用weights选项algorithm选项 算法测试与结果评价原理及方法函数主要参数说明Python代码实现 示例反思与总结 写在前面的话
  • 《Python爬虫技术:深入理解原理、技术与开发》读书笔记(一)

    目录 前言第1章 基础知识第2章 爬虫基础HTTP基础URL与URI超文本HTTP与HTTPSHTTP的请求过程Network面版 前言 这是本系列的第一篇文章 xff0c 文如其题 xff0c 这个系列旨在学习Python爬虫技术 本系列
  • 给软件工程师的自学建议

    给软件工程师的自学建议 与现在大学生的情况类似 xff0c 学校学的专业知识总是与实际工作中需要的知识相差甚远 或许进入我们这个行业就注定要一辈子不离书本 不离学习了 由于软硬件技术的推陈出新 xff0c 学校教的C Basic Pasca
  • Python基础入门—for循环

    Python基础入门 for循环 for 循环 xff1a range的使用 xff1a 循环控制语句 xff1a for else的使用 xff1a for循环嵌套 xff1a for 循环 xff1a for循环格式 xff1a for
  • 软件测试之项目总结全攻略

    在我们测试工作过程中 xff0c 由于公司业务发展 xff0c 快速迭代等原因 xff0c 我们遇到的项目以小项目居多 更新界面元素 xff0c 上个活动页 xff0c 优化一下原有的功能等等 xff0c 加上事情繁琐 xff0c 任务多
  • 教你用Python写一个京东自动下单抢购脚本(Python实现京东自动抢购)

    很多朋友都有网购抢购限量商品的经历 有时候蹲点抢怎么也抢不到 今天小编带你们学习怎么用Python写一个京东自动下单抢购脚本 以后再也不用拼手速拼网速啦 快来一起看看吧 1 问题背景 经过无数次抢购失败后 xff0c 发现商家会不定时的放出
  • JAVA基础题练习

    顺序插入 xff1a 插入有序 Scanner input 61 new Scanner System in char arr2 61 39 b 39 39 d 39 39 f 39 39 i 39 39 k 39 39 m 39 39 x
  • ubuntu20.04安装qq音乐并解决闪退问题

    在qq音乐官网下载linux版coco音乐 xff1a https y qq com download download html 下载deb包并且通过下面命令行安装 xff1a span class token function sudo
  • 架构师装逼核武器

    架构师这个职位是很多程序猿的梦想 xff0c 我有很多朋友私下和我聊天的时候 xff0c 曾多次问我要如何才能成为一个架构师 xff0c 对于这个问题 xff0c 我只能粗略的谈谈我个人的观点 xff0c 如有不同观点 xff0c 欢迎交流
  • 一文讲透java日志框架

    在项目开发过程中 xff0c 有一个必不可少的环节就是记录日志 xff0c 相信只要是个程序员都用过 xff0c 可是咱们自问下 xff0c 用了这么多年的日志框架 xff0c 你确定自己真弄懂了日志框架的来龙去脉嘛 xff1f 下面笔者就
  • HashMap底层原理

    在我们实际的项目中 xff0c HashMap这个集合类经常被用到 xff0c 可是就是这么一个常用的集合类 xff0c 却往往成了咱们面试中的绊脚石 即便你是个初级程序员 xff0c 也常会让你谈谈HashMap的底层原理 xff0c 今
  • 聊聊ThreadPoolExecutor线程池

    ThreadPoolExecutor是线程的池化技术 xff0c 也就是首先创建几个线程 xff0c 然后把线程放到池子里 xff0c 有任务来的时候直接从线程池中拉线程来执行任务 为什么要用池化技术 xff1f java中的线程是系统级别
  • Spring框架系列之bean的生命周期底层原理06

    bean的生命周期 xff0c 咱们必须从 AnnotationConfigApplicationContext的getBean方法开始 xff0c getBean顾名思义就是从Spring容器中得到一个Bean的实例对象 xff0c Sp
  • 电信运营商移动互联网发展分析

    电信运营商移动互联网发展分析 移动互联网是通信业发展的大趋势 xff0c 随着3G 和WiMAX 等高速无线接入技术的飞速发展 xff0c 移动互联网不仅继承固定互联网的很多技术 xff0c 并且在商务 娱乐以及移动性等方面拓展用户需求 自
  • Spring框架系列之bean的生命周期底层原理07

    上一篇我们预留了两个大的内容 xff0c 一个是Object sharedInstance 61 getSingleton beanName 从单例池中获取数据 xff0c 另外一个是getSingleton方法创建单例Bean xff0c
  • Spring框架系列之bean的生命周期底层原理08

    接着上一篇 xff0c 咱们继续doCreateBean方法的分析 xff0c doCreateBean内容比较多 xff0c 我们这次主要是把它的整体流程说下 xff0c 后续会逐个来分析每一个关键点 代码如下 xff1a protect
  • 2020-09-25 Python基础学习第三天笔记

    文章目录 一 可变字符串二 运算符三 列表1 列表的创建2 列表常用命令3 多维列表 四 元组 2020 9 24 Day3 一 可变字符串 需要原地修改字符串 xff0c 可以使用 io StringIO 对象或 array 模块 spa
  • Python Cookbook学习总结

    第一章 xff1a 数据结构和算法 任何序列 xff08 可迭代的对象 xff09 都可以通过一个简单的赋值操作来分解为单独的变量 xff0c 唯一的要求是变量的总数和结构要与序列相吻合 xff08 比如对于存储二维坐标等的二维数组 xff
  • SpringBoot解析yml/yaml/properties配置文件的四种方式汇总

    目录 一 配置文件注入方式一 64 Value 二 配置文件注入方式二 64 ConfigurationProperties 三 自定义解析类 xff0c 直接暴力读取yml配置文件 四 Spring配置文件的解析类Environment获