使用yml工具类获取yml属性
最近在写一个工具类,在测试时发现main内无法使用自动注入获取配置文件yml属性值。于是查阅相关资料,手写了yml工具类,用于在无法使用spring自动注入时手动获取yml属性。
相关代码如下:
import com.google.common.collect.Maps; import org.yaml.snakeyaml.Yaml; import java.io.FileInputStream; import java.net.URL; import java.util.Iterator; import java.util.Map; import java.util.Objects; public class YmlUtils { private static final String YML = "application.yml"; private static final Map<String, Object> ymlMap = Maps.newConcurrentMap(); static { getApplicationYml(YML); getApplicationYml(getActiveYml()); } private static String getActiveYml() { String[] strings = YML.split("\."); return strings[0] + "-" + ymlMap.get("spring.profiles.active") + "." + strings[1]; } private static void getApplicationYml(String yml) { Yaml yaml = new Yaml(); URL url = ClassLoader.getSystemResource(yml); try (FileInputStream in = new FileInputStream(url.getFile())) { Map<String, Object> map = cast(yaml.loadAs(in, Map.class)); switchToMap("", map); } catch (Exception e) { e.printStackTrace(); } } private static void switchToMap(String myKey, Map<String, Object> map) { Iterator<String> it = map.keySet().iterator(); String tmpkey = myKey; while (it.hasNext()) { String key = it.next(); myKey = tmpkey + key; Object value = map.get(key); if (value instanceof Map) { switchToMap(myKey.concat("."), cast(value)); } else if (Objects.nonNull(value)) { ymlMap.put(myKey, value); //System.out.println(myKey + "->" + map.get(key)); } } } @SuppressWarnings("unchecked") private static <T> T cast(Object obj) { return (T) obj; } public static <T> T get(String key) { return cast(ymlMap.get(key)); } public static String getString(String key) { return String.valueOf(ymlMap.get(key)); } public static void main(String[] args) { String jdbc = getString("spring.datasource.url"); System.out.println(jdbc); } }