文章11 | 阅读 5709 | 点赞0
简单的说配置文件的获取方式可以分为以下四种:
平常我们使用到的配置方式主要是local configuration,也就是配置文件放在resource中,log4j会自动查找到该文件然后解析。
图看上去比较复杂,我们平时在resource文件下配置的配置文件,是从[配置文件字符串是否null ==> 是]之后的流程开始的,也就是流程图的下半部分,我们来看看这部分的代码。
private Configuration getConfiguration(final LoggerContext loggerContext, final boolean isTest, final String name) {
//这里的name是指的context hash之后的字符串
final boolean named = Strings.isNotEmpty(name);
final ClassLoader loader = LoaderUtil.getThreadContextClassLoader();
//getFactories方法获取的是ConfigurationFactory初始化的时候默认加载的用于解析配置文件的工厂类,分四种:
//PropertyConfigruationFactory
//JsonConfigruationFactory
//XmlConfigruationFactory
//YamlConfigruationFactory
for (final ConfigurationFactory factory : getFactories()) {
String configName;
final String prefix = isTest ? TEST_PREFIX : DEFAULT_PREFIX;
final String [] types = factory.getSupportedTypes();
if (types == null) {
continue;
}
//每一个配置工厂可能支持多个扩展名,譬如Yaml文件就有两种:.yaml, .yml
for (final String suffix : types) {
if (suffix.equals(ALL_TYPES)) {
continue;
}
//test,context name主要就是用在此处拼接配置文件的名字,就只是如此而已
configName = named ? prefix + name + suffix : prefix + suffix;
//根据名字和当前的classloader加载配置文件
final ConfigurationSource source = ConfigurationSource.fromResource(configName, loader);
if (source != null) {
if (!factory.isActive()) {
LOGGER.warn("Found configuration file {} for inactive ConfigurationFactory {}", configName, factory.getClass().getName());
}
//调用配置工厂来解析配置文件
return factory.getConfiguration(loggerContext, source);
}
}
}
return null;
}
流程可以简单的变成下边这个这样:
log4j2在读取配置文件方面比我做的工作比我想象中的要多的多~,不过仔细去看源码的话,发现这块代码写的好像不是很好,不是很容易读。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/sweetyi/article/details/104942310
内容来源于网络,如有侵权,请联系作者删除!