您的位置:首页 > 编程语言 > Java开发

Spring AutoConfigurationMetadataLoader是如何工作的 ?

2017-11-15 18:17 633 查看
AutoConfigurationMetadataLoader是 Spring boot autoconfigure 加载AutoConfigurationMetadata的内部工具类

/**
* 用于加载 AutoConfigurationMetadata 的内部工具类
*/
final class AutoConfigurationMetadataLoader {

// 定义要加载的AutoConfigurationMetadata的文件路径
protected static final String PATH = "META-INF/"
+ "spring-autoconfigure-metadata.properties";

private AutoConfigurationMetadataLoader() {
}

public static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader) {
return loadMetadata(classLoader, PATH);
}

static AutoConfigurationMetadata loadMetadata(ClassLoader classLoader, String path) {
try {
// 找到自动配置元数据属性文件,可能有多个
// 其实就是各个jar包中的文件META-INF\spring-autoconfigure-metadata.properties,
// 其路径类似于spring-boot-autoconfigure-xxx.jar!\META-INF\spring-autoconfigure-metadata.properties
Enumeration<URL> urls = (classLoader != null ? classLoader.getResources(path)
: ClassLoader.getSystemResources(path));
// 从所发现的配置文件中加载所有的配置信息到一个 properties    对象
Properties properties = new Properties();
while (urls.hasMoreElements()) {
properties.putAll(PropertiesLoaderUtils
.loadProperties(new UrlResource(urls.nextElement())));
}
// 返回AutoConfigurationMetadata对象,其实现为内部类 PropertiesAutoConfigurationMetadata
return loadMetadata(properties);
}
catch (IOException ex) {
throw new IllegalArgumentException(
"Unable to load @ConditionalOnClass location [" + path + "]", ex);
}
}

static AutoConfigurationMetadata loadMetadata(Properties properties) {
return new PropertiesAutoConfigurationMetadata(properties);
}

/**
* 基于一个属性文件(properties file)的AutoConfigurationMetadata实现
*/
private static class PropertiesAutoConfigurationMetadata
implements AutoConfigurationMetadata {

private final Properties properties;

PropertiesAutoConfigurationMetadata(Properties properties) {
this.properties = properties;
}

@Override
public boolean wasProcessed(String className) {
return this.properties.containsKey(className);
}

@Override
public Integer getInteger(String className, String key) {
return getInteger(className, key, null);
}

@Override
public Integer getInteger(String className, String key, Integer defaultValue) {
String value = get(className, key);
return (value != null ? Integer.valueOf(value) : defaultValue);
}

@Override
public Set<String> getSet(String className, String key) {
return getSet(className, key, null);
}

@Override
public Set<String> getSet(String className, String key,
Set<String> defaultValue) {
String value = get(className, key);
return (value != null ? StringUtils.commaDelimitedListToSet(value)
: defaultValue);
}

@Override
public String get(String className, String key) {
return get(className, key, null);
}

@Override
public String get(String className, String key, String defaultValue) {
String value = this.properties.getProperty(className + "." + key);
return (value != null ? value : defaultValue);
}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring-boot