JavaEE-自定义SSM-编写核心-解析yml文件

news2024/11/17 11:50:22

3.3.1 加载yml文件
在这里插入图片描述

  • 编写yaml工厂,用于加载yml文件

    package com.czxy.yaml;
    
    import java.io.InputStream;
    
    /**
     * 用于处理 application.yml文件
     * 1. 加载application.yml文件
     * 2. yaml工具类进行解析
     *      Map<String, Map<String, Map<....>> >
     *          twoMap.put("port", 9090)
     *          oneMap.put("server", twoMap)
     * 3. 将特殊的map转换,另一种map
     *      Map<String, Object>
     *          map.put("server.port",9090)
    public class YamlFactory {
    
        private static InputStream yamlInputStream;
    
        /**
         * 加载yaml文件
         */
        private static void loadFile() {
            //获得类加载器(当前类名.class.getClassLoader())
            ClassLoader classLoader = YamlFactory.class.getClassLoader();
    
            //通过类加载器获得资源文件流
            yamlInputStream = classLoader.getResourceAsStream("application.yml");
    
            //校验
            if(yamlInputStream == null) {
                throw new RuntimeException("Missing configuration file application.yml");
            }
        }
    
    
        public static void init() {
            //加载yaml文件
            loadFile();
            System.out.println(yamlInputStream);
            //解下yaml文件
        }
    
    
    }
    
    
  • 测试类

    package com.czxy;
    
    import com.czxy.yaml.YamlFactory;
    
    
    public class TestYaml {
        public static void main(String[] args) {
            YamlFactory.init();
        }
    }
    
    

3.3.2 解析yaml文件

在这里插入图片描述

package com.czxy.yaml;

import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.BaseConstructor;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.representer.Representer;

import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;

/**
 * 用于处理 application.yml文件
 * 1. 加载application.yml文件
 * 2. yaml工具类进行解析
 *      Map<String, Map<String, Map<....>> >
 *          twoMap.put("port", 9090)
 *          oneMap.put("server", twoMap)
 * 3. 将特殊的map转换,另一种map
 *      Map<String, Object>
 *          map.put("server.port",9090)
 * @author 桐叔
 * @email liangtong@itcast.cn
 * @description
 */
public class YamlFactory {
    //yaml文件流
    private static InputStream yamlInputStream;
    //yaml文件中的数据
    private static Map<String,Object> yamlData;

    /**
     * 加载yaml文件
     */
    private static void loadFile() {
        //获得类加载器(当前类名.class.getClassLoader())
        ClassLoader classLoader = YamlFactory.class.getClassLoader();

        //通过类加载器获得资源文件流
        yamlInputStream = classLoader.getResourceAsStream("application.yml");

        //校验
        if(yamlInputStream == null) {
            throw new RuntimeException("Missing configuration file application.yml");
        }
    }

    /**
     * 解析yaml
     * yaml核心工具类参数参考:https://vimsky.com/examples/detail/java-class-org.yaml.snakeyaml.representer.Representer.html
     * http://www.yiidian.com/sources/java_source/org.yaml.snakeyaml.representer.Representer.html
     */
    private static void parseYaml() {

        //参数设置
        LoaderOptions loaderOptions = new LoaderOptions();
        loaderOptions.setAllowDuplicateKeys(false);         //key不允许重复
        loaderOptions.setMaxAliasesForCollections(Integer.MAX_VALUE);
        loaderOptions.setAllowRecursiveKeys(true);          //key允许递归
        BaseConstructor constructor = new SafeConstructor(loaderOptions);

        Representer representer = new Representer();

        DumperOptions dumperOptions = new DumperOptions();
//        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);

        //核心类
        Yaml yaml = new Yaml(constructor,representer, dumperOptions);
        //加载yaml文件
        Map<String,Object> data  = yaml.load(yamlInputStream);
        if(data != null) {
            yamlData = data;
        } else {
            yamlData = new HashMap<>();
        }
        System.out.println(yamlData);
    }


    public static void init() {
        //加载yaml文件
        loadFile();
        //解析yaml文件
        parseYaml();
    }


}

3.3.3 处理yaml数据

  • 从spring boot源码中获得4个方法
    在这里插入图片描述
package com.czxy.yaml;

import com.sun.istack.internal.Nullable;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.BaseConstructor;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.representer.Representer;

import java.io.InputStream;
import java.util.*;

/**
 * 用于处理 application.yml文件
 * 1. 加载application.yml文件
 * 2. yaml工具类进行解析
 *      Map<String, Map<String, Map<....>> >
 *          twoMap.put("port", 9090)
 *          oneMap.put("server", twoMap)
 * 3. 将特殊的map转换,另一种map
 *      Map<String, Object>
 *          map.put("server.port",9090)
 * @author 桐叔
 * @email liangtong@itcast.cn
 * @description
 */
public class YamlFactory {
    //yaml文件流
    private static InputStream yamlInputStream;
    //yaml文件中的数据
    private static Map<String,Object> yamlData;

    /**
     * 加载yaml文件
     */
    private static void loadFile() {
        //获得类加载器(当前类名.class.getClassLoader())
        ClassLoader classLoader = YamlFactory.class.getClassLoader();

        //通过类加载器获得资源文件流
        yamlInputStream = classLoader.getResourceAsStream("application.yml");

        //校验
        if(yamlInputStream == null) {
            throw new RuntimeException("Missing configuration file application.yml");
        }
    }

    /**
     * 解析yaml
     * yaml核心工具类参数参考:https://vimsky.com/examples/detail/java-class-org.yaml.snakeyaml.representer.Representer.html
     */
    private static void parseYaml() {

        //参数设置
        LoaderOptions loaderOptions = new LoaderOptions();
        loaderOptions.setAllowDuplicateKeys(false);         //key不允许重复
        loaderOptions.setMaxAliasesForCollections(Integer.MAX_VALUE);
        loaderOptions.setAllowRecursiveKeys(true);          //key允许递归
        BaseConstructor constructor = new SafeConstructor(loaderOptions);

        Representer representer = new Representer();

        DumperOptions dumperOptions = new DumperOptions();
//        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);

        //核心类
        Yaml yaml = new Yaml(constructor,representer, dumperOptions);
        //加载yaml文件
        Map<String,Object> data  = yaml.load(yamlInputStream);
        if(data != null) {
            yamlData = getFlattenedMap(data);
        } else {
            yamlData = new HashMap<>();
        }
        System.out.println(yamlData);
    }

    /**
     * 初始化
     */
    public static void init() {
        //加载yaml文件
        loadFile();
        //解析yaml文件
        parseYaml();
    }

    /**
     * 将无限极,转换成 A.B.C 形式的key
     * @param source
     * @return
     */
    private static Map<String, Object> getFlattenedMap(Map<String, Object> source) {
        Map<String, Object> result = new LinkedHashMap<>();
        buildFlattenedMap(result, source, (String)null);
        return result;
    }

    private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) {
        source.forEach((key, value) -> {
            if (hasText(path)) {
                if (key.startsWith("[")) {
                    key = path + key;
                }
                else {
                    key = path + '.' + key;
                }
            }
            if (value instanceof String) {
                result.put(key, value);
            }
            else if (value instanceof Map) {
                // Need a compound key
                @SuppressWarnings("unchecked")
                Map<String, Object> map = (Map<String, Object>) value;
                buildFlattenedMap(result, map, key);
            }
            else if (value instanceof Collection) {
                // Need a compound key
                @SuppressWarnings("unchecked")
                Collection<Object> collection = (Collection<Object>) value;
                if (collection.isEmpty()) {
                    result.put(key, "");
                }
                else {
                    int count = 0;
                    for (Object object : collection) {
                        buildFlattenedMap(result, Collections.singletonMap(
                                "[" + (count++) + "]", object), key);
                    }
                }
            }
            else {
                result.put(key, (value != null ? value : ""));
            }
        });
    }

    /**
     * 判断是否是文本
     * @param str
     * @return
     */
    private static boolean hasText(@Nullable String str) {
        return str != null && !str.isEmpty() && containsText(str);
    }

    private static boolean containsText(CharSequence str) {
        int strLen = str.length();

        for(int i = 0; i < strLen; ++i) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }

        return false;
    }

}

3.3.4 获得数据

  • 将初始化方法private化,提供静态代码块进行初始化
    在这里插入图片描述
    提供2个方法用于获得数据

在这里插入图片描述

package com.czxy.yaml;

import com.sun.istack.internal.Nullable;
import org.yaml.snakeyaml.DumperOptions;
import org.yaml.snakeyaml.LoaderOptions;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.constructor.BaseConstructor;
import org.yaml.snakeyaml.constructor.SafeConstructor;
import org.yaml.snakeyaml.representer.Representer;

import java.io.InputStream;
import java.util.*;

/**
 * 用于处理 application.yml文件
 * 1. 加载application.yml文件
 * 2. yaml工具类进行解析
 *      Map<String, Map<String, Map<....>> >
 *          twoMap.put("port", 9090)
 *          oneMap.put("server", twoMap)
 * 3. 将特殊的map转换,另一种map
 *      Map<String, Object>
 *          map.put("server.port",9090)
 * @author 桐叔
 * @email liangtong@itcast.cn
 * @description
 */
public class YamlFactory {
    //yaml文件流
    private static InputStream yamlInputStream;
    //yaml文件中的数据
    private static Map<String,Object> yamlData;

    /**
     * 加载yaml文件
     */
    private static void loadFile() {
        //获得类加载器(当前类名.class.getClassLoader())
        ClassLoader classLoader = YamlFactory.class.getClassLoader();

        //通过类加载器获得资源文件流
        yamlInputStream = classLoader.getResourceAsStream("application.yml");

        //校验
        if(yamlInputStream == null) {
            throw new RuntimeException("Missing configuration file application.yml");
        }
    }

    /**
     * 解析yaml
     * yaml核心工具类参数参考:https://vimsky.com/examples/detail/java-class-org.yaml.snakeyaml.representer.Representer.html
     */
    private static void parseYaml() {

        //参数设置
        LoaderOptions loaderOptions = new LoaderOptions();
        loaderOptions.setAllowDuplicateKeys(false);         //key不允许重复
        loaderOptions.setMaxAliasesForCollections(Integer.MAX_VALUE);
        loaderOptions.setAllowRecursiveKeys(true);          //key允许递归
        BaseConstructor constructor = new SafeConstructor(loaderOptions);

        Representer representer = new Representer();

        DumperOptions dumperOptions = new DumperOptions();
//        dumperOptions.setDefaultFlowStyle(DumperOptions.FlowStyle.BLOCK);

        //核心类
        Yaml yaml = new Yaml(constructor,representer, dumperOptions);
        //加载yaml文件
        Map<String,Object> data  = yaml.load(yamlInputStream);
        if(data != null) {
            yamlData = getFlattenedMap(data);
        } else {
            yamlData = new HashMap<>();
        }
        System.out.println(yamlData);
    }

    /**
     * 静态代码会在当前类加载到内存中自动执行
     */
    static {
        //进行初始化
        init();
    }

    /**
     * 初始化
     */
    private static void init() {
        //加载yaml文件
        loadFile();
        //解析yaml文件
        parseYaml();
    }

    /**
     * 获得数据,如果没有返回null
     * @param key
     * @return
     */
    public static <T> T getValue(String key) {
        return getValue(key, null);
    }

    /**
     * 获得数据,如果没有,返回默认值
     * @param key A.B.C
     * @param defaultValue 默认值
     * @return
     */
    public static <T> T getValue(String key, T defaultValue) {
        //从map获得数据
        T value = (T)yamlData.get(key);
        return value != null ? value : defaultValue;
    }



    /**
     * 将无限极,转换成 A.B.C 形式的key
     * @param source
     * @return
     */
    private static Map<String, Object> getFlattenedMap(Map<String, Object> source) {
        Map<String, Object> result = new LinkedHashMap<>();
        buildFlattenedMap(result, source, (String)null);
        return result;
    }

    private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) {
        source.forEach((key, value) -> {
            if (hasText(path)) {
                if (key.startsWith("[")) {
                    key = path + key;
                }
                else {
                    key = path + '.' + key;
                }
            }
            if (value instanceof String) {
                result.put(key, value);
            }
            else if (value instanceof Map) {
                // Need a compound key
                @SuppressWarnings("unchecked")
                Map<String, Object> map = (Map<String, Object>) value;
                buildFlattenedMap(result, map, key);
            }
            else if (value instanceof Collection) {
                // Need a compound key
                @SuppressWarnings("unchecked")
                Collection<Object> collection = (Collection<Object>) value;
                if (collection.isEmpty()) {
                    result.put(key, "");
                }
                else {
                    int count = 0;
                    for (Object object : collection) {
                        buildFlattenedMap(result, Collections.singletonMap(
                                "[" + (count++) + "]", object), key);
                    }
                }
            }
            else {
                result.put(key, (value != null ? value : ""));
            }
        });
    }

    /**
     * 判断是否是文本
     * @param str
     * @return
     */
    private static boolean hasText(@Nullable String str) {
        return str != null && !str.isEmpty() && containsText(str);
    }

    private static boolean containsText(CharSequence str) {
        int strLen = str.length();

        for(int i = 0; i < strLen; ++i) {
            if (!Character.isWhitespace(str.charAt(i))) {
                return true;
            }
        }

        return false;
    }

}

3.3.5 使用:WEB服务,端口

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1414899.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

线性代数----------学习记录

线性代数发展历程 &#xff08;1&#xff09;线性方程组&#xff1a;例如二元一次方程组&#xff1b; &#xff08;2&#xff09;行列式&#xff1a;determinant,克莱默&#xff0c;莱布尼兹&#xff1b; &#xff08;3&#xff09;矩阵&#xff1a;方程个数与未知数的个数可…

webug存在的越权漏洞-水平越权以及垂直越权的漏洞复现(超详解)

越权漏洞-webug、 1.登录 账号&#xff1a;admin 密码&#xff1a;admin 2.进入逻辑漏洞 3.进入越权修改密码靶场 &#xff08;1&#xff09;输入账号密码 进入进去会发现没有权限进入 方法一&#xff1a; 这里我们只需要将 127.0.0.1:8080/control/a/auth_cross/cross_a…

编程那么难,为什么不弄一个大众一学就会的计算机语言呢?

大家好&#xff01;今天要和大家聊聊一个有趣的想法&#xff1a; 想象一下&#xff0c;如果编程变得像拼乐高积木一样简单&#xff0c;那将是多么美妙的事情啊&#xff01;不需要费尽心思去学习繁杂的语法规则和复杂的逻辑&#xff0c;只需要将代码块像积木一样拼接起来&#x…

小土堆pytorch学习笔记003 | 下载数据集dataset 及报错处理

目录 1、下载数据集 2、展示数据集里面的内容 3、DataLoader 的使用 例子&#xff1a; 结果展示&#xff1a; 1、下载数据集 # 数据集import torchvisiontrain_set torchvision.datasets.CIFAR10(root"./test10_dataset", trainTrue, downloadTrue) test_set …

Java后端开发:学籍系统核心逻辑

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Apache Doris (六十九):JDBC Catalog

🏡 个人主页:IT贫道-CSDN博客 🚩 私聊博主:私聊博主加WX好友,获取更多资料哦~ 🔔 博主个人B栈地址:豹哥教你学编程的个人空间-豹哥教你学编程个人主页-哔哩哔哩视频 目录 1. 创建Catalog

第六课:Prompt

文章目录 第六课&#xff1a;Prompt1、学习总结&#xff1a;Prompt介绍预训练和微调模型回顾挑战 Pre-train, Prompt, PredictPrompting是什么?prompting流程prompt设计 课程ppt及代码地址 2、学习心得&#xff1a;3、经验分享&#xff1a;4、课程反馈&#xff1a;5、使用Mind…

【电子通识】学习网上《初学者学习电子的常见误区文章》有感

学习硬件电子电路过程中&#xff0c;特别是初级阶段&#xff0c;可能会走进一些误区&#xff0c;会比较迷茫和困惑。如果这时不能正确对待好这些困惑&#xff0c;就会影响正常的学习&#xff0c;干扰学习的进程&#xff0c;严重时可能会半途而废。今天我从网络上看到为初学者写…

什么是单元测试?谁来做?怎么写?

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;薪资嘎嘎涨 一、什么是单元测试&#xff1f; 单元测试&#xff08;unit testing&#xff09;&#xff0c…

pytorch-metric-learning度量学习工具官方文档翻译

基于Pytorch实现的度量学习方法 开源代码&#xff1a;pytorch-metric-learning官网文档&#xff1a;PyTorch Metric Learning官方文档 度量学习相关的损失函数介绍&#xff1a; 度量学习DML之Contrastive Loss及其变种度量学习DML之Triplet Loss度量学习DML之Lifted Structu…

幻兽帕鲁服务器多少钱一台?腾讯云新版报价

腾讯云幻兽帕鲁服务器4核16G、8核32G和16核64G配置可选&#xff0c;4核16G14M带宽66元一个月、277元3个月&#xff0c;8核32G22M配置115元1个月、345元3个月&#xff0c;16核64G35M配置580元年1个月、1740元3个月、6960元一年&#xff0c;腾讯云百科txybk.com分享腾讯云幻兽帕鲁…

谷歌Chrome浏览器将通过人工智能技术升级了3项重大功能改变,Chrome (M121) 版本可以在浏览器上生成内容

从今天开始发布的 Chrome (M121) 版本起&#xff0c;Chrome 将引进一系列实验性的生成式 AI 功能。这些功能包括智能组织标签页、利用文本生成图像模型生成个性化壁纸图片&#xff0c;以及辅助写作。这些新功能将为用户提供更便捷、智能的浏览体验。 Chrome官方介绍网址&#x…

php mysql字段默认值使用问题

前提是使用了事务&#xff0c;在第一个阶段 是A表操作保存&#xff0c;第二阶段操作B表&#xff0c;操作B表的时候使用了A表的一个字段&#xff0c;这个字段在第一阶段没有设置值&#xff0c;保存的时候使用字段默认值。 【这种情况 最好是在第一阶段 把后面要使用的字段设置好…

Vue中使用TypeScript:全面指南和最佳实践

🚀 欢迎来到我的专栏!专注于Vue3的实战总结和开发实践分享,让你轻松驾驭Vue3的奇妙世界! 🌈✨在这里,我将为你呈现最新的Vue3技术趋势,分享独家实用教程,并为你解析开发中的难题。让我们一起深入Vue3的魅力,助力你成为Vue大师! 👨‍💻💡不再徘徊,快来关注…

ChatGPT 官方中文页面上线

根据页面显示&#xff0c;OpenAI 现已推出 ChatGPT 的多语言功能 Alpha 版测试&#xff0c;允许用户选择不同语言的界面进行交互。 如下图所示&#xff0c;ChatGPT 会检测系统当前所使用的语言&#xff0c;并提示用户进行语言切换。 用户也可通过设置页面选择其他语言。目前&a…

【JavaEE】网络原理:UDP数据报套接字编程和TCP流套接字编程

目录 1.UDP数据报套接字编程 1.1 DatagramSocket 1.2 DatagramPacket 1.3 InetSocketAddress 1.4 基于UDP实现回响服务器 2.TCP流套接字编程 2.1 ServerSocket 2.2 Socket 2.3 基于TCP实现回响服务器 1.UDP数据报套接字编程 API 介绍 1.1 DatagramSocket DatagramS…

【C++中STL】set/multiset容器

set/multiset容器 Set基本概念set构造和赋值set的大小和交换set的插入和删除set查找和统计 set和multiset的区别pair对组两种创建方式 set容器排序 Set基本概念 所有元素都会在插入时自动被排序。 set/multist容器属于关联式容器&#xff0c;底层结构属于二叉树。 set不允许容…

spring cloud之分布式事务

写在前面 1&#xff1a;分布式事务介绍 参考MySQL之分布式事务 。 2&#xff1a;seata实战 架构图&#xff1a; 可以看到seata在这里作为协调者的角色&#xff0c;协调所有事务的提交以及回滚&#xff0c;其中seata使用MySQL存储每个分支事务的执行状态信息&#xff0c;以…

GIT使用,看它就够了

一、目的 Git的熟练使用是一个加分项&#xff0c;本文将对常用的Git命令做一个基本介绍&#xff0c;看了本篇文章&#xff0c;再也不会因为不会使用git而被嘲笑了。 二、设置与配置 在第一次调用Git到日常的微调和参考&#xff0c;用得最多的就是config和help命令。 2.1 gi…

腾讯云4核16G幻兽帕鲁服务器多少钱?

腾讯云幻兽帕鲁服务器4核16G14M配置&#xff0c;14M公网带宽&#xff0c;限制2500GB月流量&#xff0c;系统盘为220GB SSD盘&#xff0c;优惠价格66元1个月&#xff0c;277元3个月&#xff0c;支持4到8个玩家畅玩&#xff0c;地域可选择上海/北京/成都/南京/广州&#xff0c;腾…