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的更多相关文章

  1. springboot工程读取配置文件application.yml的写法

    现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...

  2. springboot工程读取配置文件application.yml的写法18045

    现在流行springboot框架的项目,里面的默认配置文件为application.yml,我们怎样读取这个配置文件呢? 先贴上我得配置文件吧 目录结构 里面内容 1 写读取配置文件的工具类 @Con ...

  3. 使用java读取解析txt文本数据,管理简单的数据

    在实际开发中会经常碰到使用编程语言读取文本文件的内容,这内容可以是各种各样的一下本人写出我自己做的一个读取文本文件的例子,文件中存储的是我的个人网站 www.yzcopen.com 导航栏目因为懒得使 ...

  4. SpringBoot(十):读取application.yml下配置参数信息,java -jar启动时项目修改参数

    读取application.yml下配置参数信息 在application.yml文件内容 my: remote-address: 192.168.1.1 yarn: weburl: http://1 ...

  5. SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active

    趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...

  6. Springboot(二)-application.yml默认的配置项以及读取自定义配置

    写在前面 ===== spring-boot 版本:2.0.0.RELEASE ===== 读取自定义配置 1.配置文件:sys.properties supply.place=云南 supply.c ...

  7. SpringBoot application.yml logback.xml,多环境配置,支持 java -jar --spring.profiles.active(转)

    趁今天有时间整理了一下 启动命令为 //开发环境 java -jar app.jar --spring.profiles.active=dev--server.port=8060 //测试环境 jav ...

  8. 【Java】SpringBoot 中从application.yml中获取自定义常量

    由于这里我想通过java连接linux,connection连接需要host.port.username.password及其他路径等等.不想每次修改的时候都去改源文件,所以想写在applicatio ...

  9. 解析xlsx文件---Java读取Excel2007

    关于Java读取Excel2007的文章在Google.百度上搜索一下,没有太好的例子,实现的也不算太好.查看了一下Poi,最新的 POI 3.5 beta 4 支持读写 Excel2007和PPT2 ...

随机推荐

  1. CodeForces 429B Working out DP

    E - Working out Time Limit:2000MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Su ...

  2. JavaScript节流与防抖函数封装

    js节流与防抖函数封装 常见应用场景: window的 resize 和 scroll 事件: 文字输入时的 keyup 事件: 元素拖拽.移动时的 mousemove 事件: 防抖 定义:多次触发事 ...

  3. Java高级项目实战03:CRM系统数据库设计

    接上一篇:Java高级项目实战02:客户关系管理系统CRM系统模块分析与介绍 欢迎点击回顾,接下来我们说说 CRM系统数据库设计. 我们根据产品的原型搞以及UI组的设计稿, 接下来就要设计数据库, 一 ...

  4. Java架构师必看,超详细的架构师知识点分享!

    在Java程序员行业中,有不少Java开发人员的理想是成为一名优秀的Java架构师,Java架构师的主要任务不是从事具体的软件程序的编写,而是从事更高层次的开发构架工作.他必须对开发技术非常了解,并且 ...

  5. Leetcode:235. 二叉搜索树的最近公共祖先

    Leetcode:235. 二叉搜索树的最近公共祖先 Leetcode:235. 二叉搜索树的最近公共祖先 Talk is cheap . Show me the code . /** * Defin ...

  6. Python 静态类型检查 mypy 示例

    以下所有例子都参考了最新版本的 Python 文档与 mypy 文档 必备条件 安装最新版本的 Python 和 mypy 要学会按需配置自己的编辑器,比如我的 VSCode 就装好了 Python ...

  7. Python爬虫库BeautifulSoup获取对象(标签)名,属性,内容,注释

    这篇文章主要介绍了Pythont特殊语法filter,map,reduce,apply使用方法,需要的朋友可以参考下(1)lambda lambda是Python中一个很有用的语法,它允许你快速定义单 ...

  8. Percona Xtrabackup 备份工具

    生成备份 $ xtrabackup --backup --target-dir=/data/backups/ 注:--target-dir可以放在my.cnf配置文件中.如果指定的目录不存在,xtra ...

  9. .Net 程序代码混淆加密工具 ILProtector

    我的项目中某一部分信息比较敏感,但是.Net程序反编译之后连注释都看得到.需要把exe保护起来,如:代码混淆之后再加壳. Bing到一款.Net混淆工具  ILProtector   作为资深工具党, ...

  10. JAVA JDK keytool 生成数字证书

    简介: 数字证书作为网络安全数据传输的凭证,web在传输时客户端(浏览器)和 服务端(服务器)先进行会话握手,在握手过程中服务端会验证客户端的是否已经在服务端做了认证,这是单向认证.如果是双向认证的话 ...