springboot中解析yml文件
springboot集成log4j2时,需要将操作日志记录到数据源。这需要自己编写数据源连接信息。如下:
不太优雅,数据源是在配置文件中是有配置,可是这里又需要配置一次,而且后期切换环境给运维也增加挑战。
怎么从配置文件获取参数呢?甚至直接从容器中提取数据源?
@Value? @Autowired? getBean("dataSource")?
nonono!!!
这很蛋疼了。springboot启动时最开始就需要加载日志配置中的数据源信息,可是这时候spring所有的bean都还未加载,也无法通过任何方式在spring容器中获取参数配置。
咋搞?小弟不才,通过硬写解析yml配置文件的方法获取配置文件中的数据源配置信息。
添加依赖
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
<version>2.11.2</version>
</dependency>
新增工具类
import org.springframework.util.ResourceUtils;
import org.yaml.snakeyaml.Yaml;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
import java.util.Map;
public class YmlUtil {
public static Map<String,Object> getYaml(String filePath){
Yaml yml = new Yaml();
Reader reader = null;
try {
// String filePath = ResourceUtils.getURL("classpath:").getPath() + "/application.yml";
reader = new FileReader(new File(filePath));
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}
return yml.loadAs(reader, Map.class);
}
public static Object getPropValue(Map<String,Object> map,String key){
Map<String,Object> temp = map;
int length = key.split("\\.").length;
for (int i = 0; i < length; i++) {
if(i==length-1){
//叶子节点直接获取
return temp.get(key.split("\\.")[i]);
}else{
temp = (Map<String, Object>)temp.get(key.split("\\.")[i]);
}
}
return null;
}
//使用方法
public static void main(String[] args) {
try{
Map<String,Object> map = getYaml(ResourceUtils.getURL("classpath:").getPath() + "/application.yml");
Object val = getPropValue(map,"spring.profiles.active");
}catch (Exception e){
}
}
}