springboot中对yaml⽂件的解析
⼀、YAML是“YAML不是⼀种标记语⾔”的外语缩写(见前⽅参考资料原⽂内容);但为了强调这种语⾔以数据做为中⼼,⽽不是以置标语⾔为重点,⽽⽤重新命名。它是⼀种直观的能够被电脑识别的数据序列化格式,是⼀个可读性⾼并且容易被⼈类阅读,容易和交互,⽤来表达资料序列的编程语⾔。
⼆、在springboot中的基础配置是通过yaml的⽅式来解析实现,当然也⽀持xml的⽂件解析。这⾥主要是学习源码中了解到yaml的解析过程。帮助⾃⼰在学习源码的时候,判定spring做了哪些操作。
三、yaml的配置⽂件
server:
port: 8080
spring:
datasource:
driver-class-name: sql.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 io.Resource;
import org.springframework.lang.NonNull;
import org.springframework.lang.Nullable;
import org.springframework.util.StringUtils;
import org.yaml.snakeyaml.Yaml;
import org.ader.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 InputStream());
//单⽂件处理
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 = ();
UnicodeReader reader = new InputStream());
Object object = yaml.load(reader);
/
/这⾥只是简单处理,需要多个⽅式可以⾃⼰添加
if (object instanceof Map) {spring怎么读取xml文件
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 = ();
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);
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论