java解析.yml文件方式

 更新时间:2024年01月15日 09:27:49   作者:奈何、草  
这篇文章主要介绍了java解析.yml文件方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

java解析.yml文件

把yml文件中的datasource里所有字段的放入到一个map集合中

当想要获取数据库的url时,可以直接使用map.get(“url”)获取得到.

*.yml文件

server:
  port: 8090
  context-path: /myService
spring:
  application:
    name: AAService
  datasource:
    url: jdbc:mysql://localhost:3306/bc
    username: root
    password: 123456
    driver-class-name: com.mysql.jdbc.Driver
  jpa:
    show-sql: false
    properties:
      hibernate:
        jdbc:
          batch_size: 100
        order_inserts: true
        order_updates: true
  cloud:
    service-registry:
      auto-registration:
        enabled: false


*.引入pom包

<!-- https://mvnrepository.com/artifact/com.fasterxml.jackson.dataformat/jackson-dataformat-yaml -->
		<dependency>
			<groupId>com.fasterxml.jackson.dataformat</groupId>
			<artifactId>jackson-dataformat-yaml</artifactId>
			<version>2.9.5</version>
		</dependency>

一.测试代码

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.Yaml;




public class Test {


	public static void main(String[] args) throws Exception {
		// TODO Auto-generated method stub
		Yaml yml = new Yaml();
		//配置文件路径
		String path = Object.class.getResource("/").getPath().substring(1)+ "application.yml";
		InputStream reader = new FileInputStream(new File(path));
		//yml读取配置文件,指定返回类型为Map,Map中value类型为LinkedHashMap
		Map map = yml.loadAs(reader, Map.class);
		/**
		 * eg:获取server中的port    
		 * server:                 
  			 port: 8090
  			 context-path: /myService  
		 */
		Map mapServer = (Map)map.get("server"); 
		String port = mapServer.get("port").toString();
		System.out.println(port);//输出8090
		
		
		
		/**
		 * 但是如果格式是这样的,或者有更深层次的,我们想动态获取datasource的map集合呢?
		 * 我们可以写一个方法,使用递归动态获取map
		 spring:
   		   datasource:
             url: jdbc:mysql://localhost:3306/bc
             username: root
             password: 123456
             driver-class-name: com.mysql.jdbc.Driver
		 */
		
		
		//传入想要得到的字段
		Map datasourceMap = initYml(map,"datasource");
		System.out.println(datasourceMap.get("url"));//jdbc:mysql://localhost:3306/bc
		System.out.println(datasourceMap.get("username"));//root
		System.out.println(datasourceMap.get("password"));//123456
		System.out.println(datasourceMap.get("driver-class-name"));//com.mysql.jdbc.Driver
		
	}
	public static Map initYml(Map map,String str) {
		Map maps = new HashMap();
		Set<Map.Entry<String, Object>> set = map.entrySet();
		for (Map.Entry<String, Object> entry : set) {//遍历map
			
			if (entry.getKey().equals(str))  		//递归结束条件
				return (Map) entry.getValue();
			
			if (entry.getValue() instanceof Map) {   //如果value是Map集合递归
				maps = initYml((Map) entry.getValue(),str);
				if (maps == null)					 //递归的结果如果为空,继续遍历
					continue;
				return maps;						 //不为空返回
			}

		}

		return null;
	}

}

二.优化代码

可在其他类中直接调用

import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

import org.yaml.snakeyaml.Yaml;

public class YmlUtil {

	/**
	 * 获取yml文件中的指定字段,返回一个map
	 * 
	 * @param sourcename
	 * @return
	 */
	public static Map<String, Object> getResMap(String sourcename) {
		return YmlInit.getMapByName(YmlInit.ymlMap, sourcename);
	}

	// 配置文件仅需要读取一次,读取配置文件的同时把数据保存到map中,map定义为final,仅可以被赋值一次
	private static class YmlInit {
		//初始化文件得到的map
		private static final Map<String, Object> ymlMap = getYml();

		// 读取配置文件,并初始化ymlMap
		private static Map<String, Object> getYml() {
			Yaml yml = new Yaml();
			String path = Object.class.getResource("/").getPath().substring(1) + "application.yml";
			Reader reader = null;
			try {
				reader = new FileReader(new File(path));
			} catch (Exception e) {
				// TODO: handle exception
				e.printStackTrace();
			}
			return yml.loadAs(reader, Map.class);
		}

		// //传入想要得到的字段
		private static Map<String, Object> getMapByName(Map<String, Object> map, String name) {
			Map<String, Object> maps = new HashMap<String, Object>();
			Set<Map.Entry<String, Object>> set = map.entrySet();
			for (Map.Entry<String, Object> entry : set) {// 遍历map
				Object obj = entry.getValue();
				if (entry.getKey().equals(name))      // 递归结束条件
					return (Map<String, Object>) obj;
				
				if (entry.getValue() instanceof Map) {//如果value是Map集合递归
					maps = getMapByName((Map<String, Object>) obj, name);
					if (maps == null)				   //递归的结果如果为空,继续遍历
						continue;
					return maps;					  //不为空返回
				}
			}
			return null;
		}
	}

}

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java启动jar包设置启动参数的实现

    java启动jar包设置启动参数的实现

    本文主要介绍了java启动jar包设置启动参数的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • Java深入讲解Object类常用方法的使用

    Java深入讲解Object类常用方法的使用

    前面java继承中说到的Object类是java中一个特殊的类,所有的类都是直接或者间接的继承自Object类,即如果某个类没有使用extends关键字则默认是java.lang.Object类的子类,所以所有的类都可以使用Object类中定义的方法,下面介绍Object类的常用方法
    2022-04-04
  • JRebel2023.3 插件使用及安装步骤详解

    JRebel2023.3 插件使用及安装步骤详解

    JRebel是一款JVM插件,它使得Java代码修改后不用重启系统,立即生效,IDEA上原生是不支持热部署的,一般更新了 Java 文件后要手动重启 Tomcat 服务器,才能生效,浪费时间浪费生命,目前对于idea热部署最好的解决方案就是安装JRebel插件,本文分步骤介绍的非常详细,一起看看吧
    2023-08-08
  • 全面理解Java类和对象

    全面理解Java类和对象

    下面小编就为大家带来一篇全面理解Java类和对象。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2016-06-06
  • Java中的自旋锁spinlock详解

    Java中的自旋锁spinlock详解

    这篇文章主要介绍了Java中的自旋锁spinlock详解,自旋锁就是循环尝试获取锁,不会放弃CPU时间片,减伤cup上下文切换,缺点是循环会消耗cpu,需要的朋友可以参考下
    2024-01-01
  • 解决Tomcat启动报异常java.lang.ClassNotFoundException问题

    解决Tomcat启动报异常java.lang.ClassNotFoundException问题

    这篇文章主要介绍了解决Tomcat启动报异常java.lang.ClassNotFoundException问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • 详解Java多线程编程中LockSupport类的线程阻塞用法

    详解Java多线程编程中LockSupport类的线程阻塞用法

    LockSupport类提供了park()和unpark()两个方法来实现线程的阻塞和唤醒,下面我们就来详解Java多线程编程中LockSupport类的线程阻塞用法:
    2016-07-07
  • Spring实战之搜索Bean类操作示例

    Spring实战之搜索Bean类操作示例

    这篇文章主要介绍了Spring实战之搜索Bean类操作,结合实例形式分析了Spring搜索Bean类的相关配置、接口实现与操作技巧,需要的朋友可以参考下
    2019-12-12
  • Spring Boot Actuator监控器配置及使用解析

    Spring Boot Actuator监控器配置及使用解析

    这篇文章主要介绍了Spring Boot Actuator监控器配置及使用解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • IntelliJ IDEA中Project与Module的概念以及区别

    IntelliJ IDEA中Project与Module的概念以及区别

    这篇文章主要给大家介绍了关于IntelliJ IDEA中Project与Module的概念以及区别的相关资料,文中通过实例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01

最新评论