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

在这里插入图片描述

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

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

相关文章

Linux使用二进制包安装MySQL

目录 一、软件包下载 二、上传软件包到Linux根目录 1、使用xftp将软件包上传到根目录 2、解压缩 三、准备工作 四、初始化软件 五、设置MySQL的配置文件 六、配置启动脚本 一、软件包下载 官网下载&#xff1a;MySQL :: Download MySQL Community Server 二、上传软件…

AWTK 开源串口屏开发(8) - 系统设置

AWTK 开源串口屏开发 - 系统设置 系统设置只是一个普通应用程序&#xff0c;不过它会用 默认模型 中一些内置的属性和命令&#xff0c;所以这里专门来介绍一下。 1. 功能 在这个例子会用到 默认模型 中一些下列内置的属性和命令&#xff1a; 内置属性 属性类型说明rtc_yea…

【Unity3D日常开发】Unity3D中设置Text行首不出现标点符号

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好&#xff0c;我是佛系工程师☆恬静的小魔龙☆&#xff0c;不定时更新Unity开发技巧&#xff0c;觉得有用记得一键三连哦。 一、前言 在开发中会遇到Text的文本内容行首出现标点符号的情况&#xf…

PyTorch初探:基本函数与案例实践

正文&#xff1a; 在熟悉了PyTorch的安装和环境配置后&#xff0c;接下来让我们深入了解PyTorch的基本函数&#xff0c;并通过一个简单的案例来实践这些知识。 1. 基本函数 PyTorch的核心是张量&#xff08;Tensor&#xff09;&#xff0c;它类似于多维数组&#xff0c;但可以…

Cesium加载地图-高德影像

废话不多说&#xff0c;直接上代码 整体代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><…

hive面试题

0. 思维导图 1. 简述Hive♥♥ 我理解的&#xff0c;hive就是一款构建数据仓库的工具&#xff0c;它可以就结构化的数据映射为一张表&#xff0c;并且可以通过SQL语句进行查询分析。本质上是将SQL转换为MapReduce或者spark来进行计算&#xff0c;数据是存储在hdfs上&#xff0c;…

【word】论文、报告:①插入图表题注,交叉引用②快速插入图表目录③删改后一键更新

【word】①插入图表题注&#xff0c;②删改后一键更新 写在最前面插入题注交叉引用修改插入题注的文字格式快速插入图表目录 插入题注后有删改&#xff0c;实现编号一键更新 &#x1f308;你好呀&#xff01;我是 是Yu欸 &#x1f30c; 2024每日百字篆刻时光&#xff0c;感谢你…

ubuntu安装mongod

1、安装 1.1包管理公钥导入 wget -qO - https://www.mongodb.org/static/pgp/server-6.0.asc | sudo apt-key add -执行结果截图如下&#xff1a; 1.2创建列表文件 lsb_release -dc 根据你的Codename 来修改下方对应的命令&#xff0c;如果你的是jammy&#xff0c;就修改为j…

Hive常见问题汇总

Hive和Hadoop的关系 Hive 构建在 Hadoop 之上&#xff0c; HQL 中对查询语句的解释、优化、生成查询计划是由 Hive 完成的 所有的数据都是存储在 Hadoop 中 查询计划被转化为 MapReduce 任务&#xff0c;在 Hadoop 中执行&#xff08;有些查询没有 MR 任务&#xff0c;如&…

防御保护---安全策略

文章目录 一.安全策略概述 概述&#xff1a; 安全策略的作用&#xff1a; 包过滤防火墙的安全风险 状态检测防火墙访问过程 安全策略与传统防火墙的区别 二.案例分析 基础配置&#xff1a;&#xff08;正常数通&#xff09; 安全策略配置 练习 一.安全策略概述 概述&#xff1…

OpenAI API 的最新动态:新一代的嵌入模型,更新 GPT-4 Turbo,更新 GPT-3.5 Turbo 以及降低 API 价格

文章目录 一、前言二、主要内容三、总结 &#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 一、前言 OpenAI 正在推出新一代嵌入模型、新的 GPT-4 Turbo 和审查模型、新的 API 使用管理工具&#xff0c;而且很快就会降低 GPT-3.5 Turbo 的价格。 OpenAI…

vuepress搭建个人博客以及部署

vuepress&#xff0c;Vue 驱动的静态网站生成器&#xff0c;以 Markdown 为中心的项目结构&#xff0c;以最少的配置帮助你专注于写作。 vuepress官网 vuepress存在很多主题&#xff0c;也可以自定义设计主题&#xff0c;上传npm使用 这里采用vuepress-theme-hope主题模板进行制…

移动端应用(APP)如何设计测试用例?

为 APP 设计测试用例需要考虑移动设备的特殊性&#xff0c;如不同的操作系统、设备尺寸、硬件特性以及应用程序自身的特定功能。 以下是为APP设计测试用例时要考虑的内容&#xff1a; 1. 理解需求 熟悉APP的功能需求、用户故事和设计文档。 确定APP的目标用户群体、使用场景…

Leetcode刷题笔记题解(C++):1114. 按序打印(多线程)

思路&#xff1a; 保证A,B,C三个线程的顺序不会变&#xff0c;即优先级顺序的问题 A,B需要资源1&#xff0c;B,C需要资源2 A先占用资源1和资源2&#xff0c;A线程完了之后释放资源1不释放资源2&#xff0c;然后B线程占用资源1&#xff0c;A线程完了之后释放资源1和资源2&…

C++ 11 多线程库初步学习

在C11标准中&#xff0c;可以简单通过使用thread库&#xff0c;来管理多线程。 thread库可以看做对不同平台多线程API的一层包装&#xff1b;因此使用新标准提供的线程库编写的程序是跨平台的。 使用时需要#include <thread>头文件&#xff1b; #include <iostream&g…

Wpf 使用 Prism 实战开发Day16

客户端使用RestSharp库调用WebApi 动态加载数据 在MyDoTo客户端中&#xff0c;使用NuGet 安装两个库 RestSharp Newtonsoft.Json 一. RestSharp 简单的使用测试例子 当前章节主要目的是&#xff1a;对RestSharp 库&#xff0c;根据项目需求再次进行封装。下面先做个简单的使用…

瑞丽杂志引领潮流,VOSS眼镜概念店开启奢华新纪元!

近日&#xff0c;由《瑞丽》杂志社举办的2023第4届瑞丽轻奢品牌大赛&#xff0c;以“轻奢•悦藏”为主题的大赛已圆满结束&#xff0c;VOSS眼镜荣获&#xff1a;2023瑞丽轻奢品牌大赛「轻奢时尚风格奖」&#xff0c;作为眼镜行业唯一获此奖项的品牌&#xff0c;VOSS眼镜对此表示…

LeetCode.11. 盛最多水的容器

题目 题目链接 分析 这道题的意思就是让我们找两个下标&#xff0c;以这两个下标组成的线为底&#xff0c;高度取这两个位置对应数字的最小值为高&#xff0c;组成一个长方形&#xff0c;求长方形最大的面积可以为多少。 暴力的解法是什么&#xff1f;&#xff1f;&#xf…

取消Vscode在输入符号时自动补全

取消Vscode在输入符号时自动补全 取消Vscode在输入符号时自动补全问题演示解决方法 取消Vscode在输入符号时自动补全 问题演示 在此状态下输入/会直接自动补全, 如下图 笔者想要达到的效果为可以正常输入/而不进行补全, 如下图 解决方法 在设置->文本编辑器->建议, 取消…

以太网的 MAC 层

目录 1. MAC 层的硬件地址 48 位的 MAC 地址 2. MAC 帧的格式 以太网 V2 的 MAC 帧格式 无效的 MAC 帧 IEEE 802.3 MAC 与以太网 V2 MAC 帧格式的区别 1. MAC 层的硬件地址 硬件地址又称为物理地址&#xff0c;或 MAC 地址。 IEEE 802 标准为局域网规定了一种 48 位…