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

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服务,端口

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

[数据结构]-哈希

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 本期学习目标&…

代码随想录刷题笔记-Day12

1. 二叉树的递归遍历 144. 二叉树的前序遍历https://leetcode.cn/problems/binary-tree-preorder-traversal/94. 二叉树的中序遍历https://leetcode.cn/problems/binary-tree-inorder-traversal/145. 二叉树的后续遍历https://leetcode.cn/problems/binary-tree-postorder-tra…

混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算

1.背景介绍 在训练的模型的时候&#xff0c;需要评价模型的好坏&#xff0c;就涉及到混淆矩阵、准确率、查准率、查全率、DSC、IoU、敏感度的计算。 2、混淆矩阵的概念 所谓的混淆矩阵如下表所示&#xff1a; TP:真正类&#xff0c;真的正例被预测为正例 FN:假负类&#xf…

09. Springboot集成sse服务端推流

目录 1、前言 2、什么是SSE 2.1、技术原理 2.2、SSE和WebSocket 2.2.1、SSE (Server-Sent Events) 2.2.2、WebSocket 2.2.3、选择 SSE 还是 WebSocket&#xff1f; 3、Springboot快速集成 3.1、添加依赖 3.2、创建SSE控制器 3.2.1、SSEmitter创建实例 3.2.2、SSEmi…

K8s-持久化(持久卷,卷申明,StorageClass,StatefulSet持久化)

POD 卷挂载 apiVersion: v1 kind: Pod metadata:name: random-number spec:containers:- image: alpinename: alpinecommand: ["/bin/sh","-c"]args: ["shuf -i 0-100 -n 1 >> /opt/number.out;"]volumeMounts:- mountPath: /optname: da…

Ubuntu findfont: Font family ‘SimHei‘ not found.

matplotlib中文乱码显示 当我们遇到这样奇怪的问题时, 结果往往很搞笑 尝试1不行 Stopping Jupyter Installing font-manager: sudo apt install font-manager Cleaning the matplotlib cache directory: rm ~/.cache/matplotlib -fr Restarting Jupyter. 尝试2 This work fo…

AI大模型开发架构设计(6)——AIGC时代,如何求职、转型与选择?

文章目录 AIGC时代&#xff0c;如何求职、转型与选择&#xff1f;1 新职场&#xff0c;普通人最值钱的能力是什么?2 新职场成长的3点建议第1点&#xff1a;目标感第2点&#xff1a;执行力第3点&#xff1a;高效生产力 3 新职场会产生哪些新岗位机会?如何借势?4 新职场普通人…

微信小程序(十七)自定义组件生命周期(根据状态栏自适配)

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.获取手机状态栏的高度 2.验证attached可以修改数据 3.动态绑定样式数值 源码&#xff1a; myNav.js Component({lifetimes:{//相当于vue的created,因为无法更新数据被打入冷宫created(){},//相当于vue的mount…

【运行Python爬虫脚本示例】

主要内容&#xff1a;Python中的两个库的使用。 1、requests库&#xff1a;访问和获取网页内容&#xff0c; 2、beautifulsoup4库&#xff1a;解析网页内容。 一 python 爬取数据 1 使用requests库发送GET请求&#xff0c;并使用text属性获取网页内容。 然后可以对获取的网页…

基于python flask茶叶网站数据大屏设计与实现,可以做期末课程设计或者毕业设计

基于Python的茶叶网站数据大屏设计与实现是一个适合期末课程设计或毕业设计的项目。该项目旨在利用Python技术和数据可视化方法&#xff0c;设计和开发一个针对茶叶行业的数据大屏&#xff0c;用于展示和分析茶叶网站的相关数据。 项目背景 随着互联网的快速发展&#xff0c;越…

一张图区分Spring Task的3种模式

是的&#xff0c;只有一张图&#xff1a; fixedDelay 模式cron 模式fixedRate 模式

[HUBUCTF 2022 新生赛]ezPython

打开是一个pyc文件&#xff0c;我用的是pycdc进行反编译 # Source Generated with Decompyle # File: ezPython.pyc (Python 3.7)from Crypto.Util.number import * import base64 import base58 password open(password.txt, r).read() tmp bytes_to_long(password.encode(u…

基于JavaWeb开发的家具定制购买网站【附源码】

基于JavaWeb开发的家具定制购买网站【附源码】 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统 &#…

GLog开源库使用

Glog地址&#xff1a;https://github.com/google/glog 官方文档&#xff1a;http://google-glog.googlecode.com/svn/trunk/doc/glog.html 1.利用CMake进行编译&#xff0c;生成VS解决方案 &#xff08;1&#xff09;在glog-master文件夹内新建一个build文件夹&#xff0c;用…

docker-compose Install influxdb1+influxdb2+telegraf

influxd2前言 influxd2 是 InfluxDB 2.x 版本的后台进程,是一个开源的时序数据库平台,用于存储、查询和可视化时间序列数据。它提供了一个强大的查询语言和 API,可以快速而轻松地处理大量的高性能时序数据。 telegraf 是一个开源的代理程序,它可以收集、处理和传输各种不…

在Ubuntu上安装pycuda记录

1. 安装CUDA Toolkit 11.8 从MZ小师妹的摸索过程来看&#xff0c;其他版本的会有bug&#xff0c;12.0的版本太高&#xff0c;11.5的太低&#xff08;感谢小师妹让我少走弯路&#xff09; 参考网址&#xff1a;CUDA Toolkit 11.8 Downloads | NVIDIA Developer 在命令行输入命…

调用阿里通义千问大语言模型API-小白新手教程-python

阿里大语言模型通义千问API使用新手教程 最近需要用到大模型&#xff0c;了解到目前国产大模型中&#xff0c;阿里的通义千问有比较详细的SDK文档可进行二次开发,目前通义千问的API文档其实是可以进行精简然后学习的,也就是说&#xff0c;是可以通过简单的API调用在自己网页或…

Vue<圆形旋转菜单栏效果>

效果图&#xff1a; 大家不一定非要制成菜单栏&#xff0c;可以看下人家的华丽效果&#x1f61d;&#xff0c;参考地址 https://travelshift.com/ 大佬写的效果可比我的强多了&#xff0c;但是无从下手&#xff0c;所以就自己琢磨怎么写了&#xff0c;只能说效果勉强差不多 可…

“steam教学理念”scratch+数学 ——时钟案例

一、时钟概念 它通常由一个圆形表盘组成&#xff0c;表盘上有12个数字&#xff0c;分别是1到12。这些数字代表了小时。在表盘上&#xff0c;还有三根指针&#xff0c;一根较短的指针叫做时针&#xff0c;另一根较长的指针叫做分针&#xff0c;而秒针通常为红色&#xff0c;且指…

LabVIEW电缆检修系统

在电力系统中&#xff0c;合理选择电缆检修策略是保障电网稳定运行的关键。现有的电缆检修策略往往忽视了电缆的技术和经济双重指标&#xff0c;导致检修效率低下和维护成本高昂。为此&#xff0c;开发了一种基于风险评估模型和全寿命周期成本&#xff08;LCC&#xff09;的电缆…