最近在写一个工具类,在测试时发现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);
}
}