一、YAML是“YAML不是一种标记语言”的外语缩写 (见前方参考资料原文内容);但为了强调这种语言以数据做为中心,而不是以置标语言为重点,而用返璞词重新命名。它是一种直观的能够被电脑识别的数据序列化格式,是一个可读性高并且容易被人类阅读,容易和脚本语言交互,用来表达资料序列的编程语言。

  二、在springboot中的基础配置是通过yaml的方式来解析实现,当然也支持xml的文件解析。这里主要是学习源码中了解到yaml的解析过程。帮助自己在学习源码的时候,判定spring做了哪些操作。

  三、yaml的配置文件

server:
port: 8080
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/model?useUnicode=true&characterEncoding=utf-8
username: root
password: root
jpa:
show-sql: true
hibernate:
ddl-auto: update

  四、yaml的解析过程

import org.springframework.core.io.Resource;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.Yaml;
import org.yaml.snakeyaml.reader.UnicodeReader; import java.io.IOException;
import java.util.*; public class YamlUtils { /**
* 单个yaml文件处理
* @param resource
* @return
* @throws IOException
*/
public static Map<String, Object> yamlHandler(@NonNull Resource resource) throws IOException {
//返回的结果
Map<String, Object> result = new LinkedHashMap<>();
//读取方式
UnicodeReader reader = new UnicodeReader(resource.getInputStream());
//单文件处理
Yaml yaml = new Yaml();
Object object = yaml.load(reader);
//这里只是简单处理,需要多个方式可以自己添加
if (object instanceof Map) {
Map map = (Map) object;
buildFlattenedMap(result, map, null);
}
reader.close();
return result;
} /**
* 单个yaml文件处理
* @param resources
* @return
* @throws IOException
*/
public static Map<String, Object> yamlHandler(@NonNull Resource[] resources) throws IOException { //返回的结果
Map<String, Object> result = new LinkedHashMap<>();
Yaml yaml = new Yaml();
//多个文件处理
Iterator<Resource> iterator = Arrays.stream(resources).iterator();
while (iterator.hasNext()) {
Resource resource = iterator.next();
UnicodeReader reader = new UnicodeReader(resource.getInputStream());
Object object = yaml.load(reader);
//这里只是简单处理,需要多个方式可以自己添加
if (object instanceof Map) {
Map map = (Map) object;
buildFlattenedMap(result, map, null);
}
reader.close();
}
return result;
} /**
* 这部分代码来至springboot源码部分对yaml的解析
* YamlProcessor.java buildFlattenedMap方法
* @param result
* @param source
* @param path
*/
private static void buildFlattenedMap(Map<String, Object> result, Map<String, Object> source, @Nullable String path) {
//循环读取原数据
source.forEach((key, value) -> {
//如果存在路径进行拼接
if (StringUtils.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) {
//如果是map,就继续读取
Map<String, Object> map = (Map)value;
buildFlattenedMap(result, map, key);
} else if (value instanceof Collection) {
Collection<Object> collection = (Collection)value;
if (collection.isEmpty()) {
result.put(key, "");
} else {
int count = 0;
Iterator var7 = collection.iterator(); while(var7.hasNext()) {
Object object = var7.next();
buildFlattenedMap(result, Collections.singletonMap("[" + count++ + "]", object), key);
}
}
} else {
result.put(key, value != null ? value : "");
}
});
} }

  五、测试

   public static void main(String[] args) throws IOException {
Map<String, Object> map = YamlUtils.yamlHandler(new ClassPathResource("config/application.yaml"));
System.out.println(map);
}

  

springboot中对yaml文件的解析的更多相关文章

  1. springboot中的pom文件是如何管理依赖的

    我们来看一下新建完成后的springboot中的pom文件 <?xml version="1.0" encoding="UTF-8"?> <p ...

  2. apt系统中sources.list文件的解析

    /etc/apt/sources.list 一般源信息都存在这个文件中.但众多软件源都放在一个文件中实在有点乱,于是新版ubuntu也有了分类的方法: 文件夹  /etc/apt/sources.li ...

  3. kubernetes中service yaml文件的port作用

    yaml文件 [root@k8s-master ~]# cat service-hello.yaml apiVersion: v1 kind: Service metadata: name: serv ...

  4. 在ASP.NET MVC 框架中调用 html文件及解析get请求中的参数值

    在ASP.NET MVC 框架中调用 html文件: public ActionResult Index() { using (StreamReader sr = new StreamReader(P ...

  5. Android从网络中获取xml文件并解析数据

    public class XmlwebData { @SuppressLint("UseValueOf") public static List<Person> get ...

  6. springboot中访问jsp文件方式

    首先,添加加载jsp文件的依赖包: <!--jsp依赖 对应springboot版本为2.1.4--><dependency> <groupId>org.apach ...

  7. android中init.rc文件的解析问题

    init.rc中文件里会通过import /init.${ro.hardware}.rc文件,这个ro.hardware应该是某个详细的属性.而这个ro.hardware赋值应该是在Init进程中赋值 ...

  8. springboot不加载mapper文件问题解析

    1. 场景描述 启动的时候报"springboot available: expected at least 1 bean which qualifies as autowire candi ...

  9. maven中的profile文件的解析

    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...

随机推荐

  1. OpenDayLight Helium实验三 OpenDaylight二层转发机制实验

    本文基于OpenDaylight二层转发机制实验 而成 在SDN网络中,处于末端的主机并不知道其连接的网络是SDN,某台主机要发送数据包到另一台主机,仍然需要进行IP到MAC地址的ARP解析.SDN网 ...

  2. Tensorflow一些常用基本概念与函数(四)

    摘要:本系列主要对tf的一些常用概念与方法进行描述.本文主要针对tensorflow的模型训练Training与测试Testing等相关函数进行讲解.为‘Tensorflow一些常用基本概念与函数’系 ...

  3. 雷林鹏分享:Ruby 日期 & 时间(Date & Time)

    Ruby 日期 & 时间(Date & Time) Time 类在 Ruby 中用于表示日期和时间.它是基于操作系统提供的系统日期和时间之上.该类可能无法表示 1970 年之前或者 2 ...

  4. C#中as和is关键字

    一. as 运算符用于在兼容的引用类型之间执行某些类型的转换.例如: static void Main(string[] args) { ]; obj[] = new class1(); obj[] ...

  5. C#对象初始或器-Chapter3 P38

    protected string GetMessage() { //如何构造和初始化泛型集合库中的一个数组和两个类. Product myProduct = ,Name="Kayak&quo ...

  6. ARIMA模型——本质上是error和t-?时刻数据差分的线性模型!!!如果数据序列是非平稳的,并存在一定的增长或下降趋势,则需要对数据进行差分处理!ARIMA(p,d,q)称为差分自回归移动平均模型,AR是自回归, p为自回归项; MA为移动平均,q为移动平均项数,d为时间序列成为平稳时所做的差分次数

    https://www.cnblogs.com/bradleon/p/6827109.html 文章里写得非常好,需详细看.尤其是arima的举例! 可以看到:ARIMA本质上是error和t-?时刻 ...

  7. python学习笔记(二)---编辑工具sublimeText3运行python

    转载地址:https://blog.csdn.net/Maek_Tyx/article/details/76933897 1. 打开Sublime text 3 安装package controlSu ...

  8. Spring Boot @SpringApplicationConfiguration 不能导入的问题

    较新版的Spring Boot取消了@SpringApplicationConfiguration这个注解,用@SpringBootTest就可以了

  9. android中LayoutInflater.from(context).inflate的分析

    在应用中自定义一个view,需要获取这个view的布局,需要用到 (LinearLayout) LayoutInflater.from(context).inflate(R.layout.conten ...

  10. oracle过滤某个字段重复记录,只获取一条记录

    一,首先想到: 1,关键字distinct 2,group by 3,MAX,MIN这样的函数被称为聚集函数,和GROUP搭配起来用 但均无法实现,执行结果如下 举例: 表名:OffsiteOutre ...