java读取解析application.yml
java读取解析application.yml
不用依赖spring容器,可单独使用。
bug已修改...
第一步、首先要2个jar
<!-- properties和yaml格式化 -->
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.9.8</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-properties</artifactId>
<version>2.9.8</version>
</dependency>
第二步、新建一个BootYaml.java
import cn.hutool.core.convert.Convert;
import cn.hutool.core.io.FileUtil;
import cn.hutool.core.io.resource.ClassPathResource;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.text.StrSpliter;
import cn.hutool.core.util.StrUtil;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonToken;
import com.fasterxml.jackson.dataformat.javaprop.JavaPropsFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLFactory;
import com.fasterxml.jackson.dataformat.yaml.YAMLGenerator;
import com.fasterxml.jackson.dataformat.yaml.YAMLParser;
import com.ynzhongxi.pay.utils.Tools;
import org.yaml.snakeyaml.Yaml;
import java.io.BufferedReader;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 写一个SpringBoot读取Yaml配置文件的类
*
* @author lixingwu
*/
public class BootYaml extends Yaml {
/**
* 环境配置路径的键值
*/
private String active;
/**
* 引入yml的键值
*/
private String include;
/**
* 配置文件的前缀
*/
private String prefix;
/**
* <p>方法名称:根据application.yml转化为LinkedHashMap.</p>
* <p>详细描述:会解析spring.profiles.active启用的配置和spring.profiles.include引入的文件.</p>
* <p>创建时间:2019-07-10 17:39:38</p>
* <p>创建作者:李兴武</p>
* <p>修改记录:</p>
*
* @param path application.yml
* @return the linked hash map
* @author "lixingwu"
*/
public LinkedHashMap loadAs(String path) {
// 组合一个map,把启用的配置,引入的文件组合起来
LinkedHashMap<String, Object> mapAll = new LinkedHashMap<>();
LinkedHashMap<String, Object> mainMap = yml2Map(path);
// 读取启用的配置
Object active = mainMap.get(this.active);
if (!Tools.isBlank(active)) {
mapAll.putAll(yml2Map(StrUtil.format("{}-{}.yml", this.prefix, active)));
}
// 加载引入的yml
Object include = mainMap.get(this.include);
// include是使用逗号分隔开的,需要切割一下
List<String> split = StrSpliter.split(Convert.toStr(include), StrUtil.C_COMMA, true, true);
for (String inc : split) {
mapAll.putAll(yml2Map(StrUtil.format("{}-{}.yml", this.prefix, inc)));
}
// 主配置覆盖其他配置
mapAll.putAll(mainMap);
// 把map转化为字符串
String mapString = MapUtil.joinIgnoreNull(mapAll, "\n", "=");
// 再把map字符串转化为yamlStr字符串
String yamlStr = properties2YamlStr(mapString);
// 使用Yaml构建LinkedHashMap
return super.loadAs(yamlStr, LinkedHashMap.class);
}
/**
* <p>方法名称:Yml 格式转 LinkedHashMap.</p>
* <p>详细描述:转载自 https://www.cnblogs.com/xujingyang/p/10613206.html .</p>
* <p>创建时间:2019-07-10 09:30:19</p>
* <p>创建作者:李兴武</p>
* <p>修改记录:</p>
*
* @param path Yml路径
* @author "lixingwu"
*/
public LinkedHashMap<String, Object> yml2Map(String path) {
final String dot = ".";
LinkedHashMap<String, Object> map = new LinkedHashMap<>();
ClassPathResource resource = new ClassPathResource(path);
// 文件不存在,置空
if (Tools.isBlank(resource)) {
return map;
}
BufferedReader reader = resource.getReader(Charset.defaultCharset());
try {
YAMLFactory yamlFactory = new YAMLFactory();
YAMLParser parser = yamlFactory.createParser(reader);
StringBuilder key = new StringBuilder();
String value;
JsonToken token = parser.nextToken();
while (token != null) {
if (!JsonToken.START_OBJECT.equals(token)) {
if (JsonToken.FIELD_NAME.equals(token)) {
if (key.length() > 0) {
key.append(dot);
}
key.append(parser.getCurrentName());
token = parser.nextToken();
if (JsonToken.START_OBJECT.equals(token)) {
continue;
}
value = parser.getText();
map.put(key.toString(), value);
int dotOffset = key.lastIndexOf(dot);
if (dotOffset > 0) {
key = new StringBuilder(key.substring(0, dotOffset));
}
} else if (JsonToken.END_OBJECT.equals(token)) {
int dotOffset = key.lastIndexOf(dot);
if (dotOffset > 0) {
key = new StringBuilder(key.substring(0, dotOffset));
} else {
key = new StringBuilder();
}
}
}
token = parser.nextToken();
}
parser.close();
return map;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* <p>方法名称:Properties内容转化为yaml内容.</p>
* <p>详细描述:.</p>
* <p>创建时间:2019-07-10 15:06:48</p>
* <p>创建作者:李兴武</p>
* <p>修改记录:</p>
*
* @param content Properties内容
* @return the string
* @author "lixingwu"
*/
public String properties2YamlStr(String content) {
// 临时生成yml
String filePath = FileUtil.getTmpDirPath() + "/temp.yml";
JsonParser parser;
JavaPropsFactory factory = new JavaPropsFactory();
try {
parser = factory.createParser(content);
} catch (IOException e) {
throw new RuntimeException(e);
}
try {
YAMLFactory yamlFactory = new YAMLFactory();
YAMLGenerator generator = yamlFactory.createGenerator(FileUtil.getOutputStream(filePath));
JsonToken token = parser.nextToken();
while (token != null) {
if (JsonToken.START_OBJECT.equals(token)) {
generator.writeStartObject();
} else if (JsonToken.FIELD_NAME.equals(token)) {
generator.writeFieldName(parser.getCurrentName());
} else if (JsonToken.VALUE_STRING.equals(token)) {
generator.writeString(parser.getText());
} else if (JsonToken.END_OBJECT.equals(token)) {
generator.writeEndObject();
}
token = parser.nextToken();
}
parser.close();
generator.flush();
generator.close();
// 读取临时生成yml的内容
String ymlContent = FileUtil.readUtf8String(filePath);
// 删除临时生成yml
FileUtil.del(filePath);
return ymlContent;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public String getActive() {
return active;
}
public void setActive(String active) {
this.active = active;
}
public String getInclude() {
return include;
}
public void setInclude(String include) {
this.include = include;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
}
第三步、创建工具类YmlPropUtils.java
import cn.hutool.core.convert.Convert;
import cn.hutool.core.text.StrSpliter;
import cn.hutool.core.util.StrUtil;
import com.ynzhongxi.pay.pojo.system.BootYaml;
import java.util.LinkedHashMap;
import java.util.List;
/**
* 读取application.yml件
*
* @author lixingwu
*/
public class YmlPropUtils {
private LinkedHashMap prop;
private static YmlPropUtils ymlPropUtils = new YmlPropUtils();
/**
* 私有构造,禁止直接创建
*/
private YmlPropUtils() {
BootYaml yaml = new BootYaml();
yaml.setActive("spring.profiles.active");
yaml.setInclude("spring.profiles.include");
yaml.setPrefix("application");
prop = yaml.loadAs("application.yml");
}
/**
* 获取单例
*
* @return YmlPropUtils
*/
public static YmlPropUtils getInstance() {
if (ymlPropUtils == null) {
ymlPropUtils = new YmlPropUtils();
}
return ymlPropUtils;
}
/**
* 根据属性名读取值
* 先去主配置查询,如果查询不到,就去启用配置查询
*
* @param name 名称
*/
public Object getProperty(String name) {
LinkedHashMap param = prop;
List<String> split = StrSpliter.split(name, StrUtil.C_DOT, true, true);
for (int i = 0; i < split.size(); i++) {
if (i == split.size() - 1) {
return param.get(split.get(i));
}
param = Convert.convert(LinkedHashMap.class, param.get(split.get(i)));
}
return null;
}
}
第四步、测试一下
public static void main(String[] args) {
Object property = YmlPropUtils.getInstance().getProperty("spring.datasource.type");
System.out.println(property);
}
over!over!
java读取解析application.yml的更多相关文章
- springboot工程读取配置文件application.yml的写法
现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...
- springboot工程读取配置文件application.yml的写法18045
现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...
- 使用java读取解析txt文本数据,管理简单的数据
在实际开发中会经常碰到使用编程语言读取文本文件的内容,这内容可以是各种各样的一下本人写出我自己做的一个读取文本文件的例子,文件中存储的是我的个人网站 www.yzcopen.com 导航栏目因为懒得使 ...
- SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数
读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...
- SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active
趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...
- Springboot(二)-application.yml默认的配置项以及读取自定义配置
写在前面 ===== spring-boot 版本:2.0.0.RELEASE ===== 读取自定义配置 1.配置文件:sys.properties supply.place=云南 supply.c ...
- SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active(转)
趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...
- 【Java】SpringBoot 中从application.yml中获取自定义常量
由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...
- 解析xlsx文件---Java读取Excel2007
关于Java读取Excel2007的文章在Google.百度上搜索一下,没有太好的例子,实现的也不算太好.查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2 ...
随机推荐
- Linux 配置 DNS
这里不讨论如何在linux上搭建一台DNS服务器: 这里讨论的是 配置 linux系统,让其能够解析域名,使用户可以流畅使用Internet 先了解几个文件,位于/etc目录下的有:hosts,hos ...
- Ubuntu14.04安装及配置mysql5.7.19
通过uname -a或lsb_release -a 查看版本信息 ,确定linux的发行版是debian还是ubuntu.root@suepc:/usr/local# uname -aLinux su ...
- 《python可以这样学》第一章
一.Python基础 查看Python版本 Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AM ...
- linux中find文件搜索命令
find 解释 命令名称:find 命令所在路径:/bin/find 执行权限:所有用户 功能描述:文件搜索 语法 find [搜索范围] [匹配条件] 匹配条件: -name 文件名(区分大小写) ...
- STT-MRAM万能存储器芯片
传统存储器的技术局限以及不断缩小的制造尺寸所带来的巨大挑战促使科研人员开始寻找新一代存储器件,它应具有接近静态存储器的纳秒级读写速度,具有动态存储器甚至闪存级别的集成密度和类似Flash的非易失性存储 ...
- 阿里Java架构师分享自己的成长经历,教你如何快速成长为架构师
架构师是公司的“金领”,很少需要考虑生存的问题,从而有更多的精力思考关键技术,形成“强者愈强”的良性循环.当然,冰冻三尺非一日之寒,成为一名合格的架构师是一个漫长的积累过程.对于大部分的软件开发人员来 ...
- css的核心原理分为优先级原则与继承原则两大部分
css原理:1.优先原则=>后解析的内容会覆盖之前解析的内容(所谓解析就是读取的css样式)2.继承原则=>嵌套里面的标签拥有外部标签的某些样式,子元素可以继承父元素的属性 1>优先 ...
- oracle快速创建用户、imp/exp导入导出dmp文件
1.首先我们可以用管理员用户以sysdba的身份登录oracle sqlplus username/password as sysdba 2.然后我就可以来创建用户了. create user use ...
- Docker 网络原理
引言 学习docker网络,可以带着下面两个问题来探讨 容器之间可以相互访问的原理 容器暴露端口后,通过宿主机访问到容器内应用,并且对于访问端而言不用感知容器存在的原理 Docker 本身的技术依赖L ...
- LeetCode 面试题 02.02. 返回倒数第 k 个节点
题目链接:https://leetcode-cn.com/problems/kth-node-from-end-of-list-lcci/ 实现一种算法,找出单向链表中倒数第 k 个节点.返回该节点的 ...