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 ...
随机推荐
- Windows渗透备忘录
Windows渗透备忘录 mimikatz mimikatz.exe ""privilege::debug"" ""sekurlsa::lo ...
- 对CAN signal 的一点理解
首先每个 ECU是一个网络节点,每个网络节点可收发一些 Message,每个Message 由CAN signals构成.每个 CAN signal利用一个或多个连续的2进制位来表示承载的信息.下 ...
- generator 和 co模块
// 类数组的生成器 // 类数组的生成器 function fns() { let obj = {0:1,1:2,2:3,length: 3}, [Symbol.iterator]: functio ...
- vue路由--静态路由
vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来.传统的页面应用,是用一些超链接来实现页面切换和跳转的.在vue-router单页面应用中,则是路径之间的切换,也就是 ...
- Java笔记---枚举类和注解
Java笔记---枚举类和注解 一.枚举类 自定义枚举类 方式一:JDK5.0之前自定义枚举类 class Seasons { //1. 声明Seasons对象的属性 private final St ...
- 优秀 .NET 开源项目集锦
Github 地址: https://github.com/jasonhua95/awesome-dotnet-core awesome-dotnet-core .NET Core框架.库和软件的中文 ...
- Eversipn STT-MRAM的MJT细胞
业界一直在寻求取代SRAM.其中之一包括自旋转移力矩MRAM(STT-MRAM).新的存储器带来了一些大胆的主张.例如STT-MRAM具有SRAM的速度和闪存的无波动性,具有无限的耐用性. 图1.ST ...
- hadoop之HDFS核心类Filesystem的使用
1.导入jar包,要使用hadoop的HDFS就要导入hadoop-2.7.7\share\hadoop\common下的3个jar包和lib下的依赖包.hadoop-2.7.7\share\hado ...
- PHP0022:PHP SESSION 设置修改删除
- 【python基础语法】国庆扩展练习题
''' 一.国庆知识小拓展 1. 用户登陆程序需求: 1. 输入用户名和密码; 2. 判断用户名和密码是否正确? (name='root', password='123') 3. 为了防止暴力破解, ...