Spring AutoConfigurationMetadataLoader是如何工作的 ?

来源:互联网 发布:美白产品推荐知乎 编辑:程序博客网 时间:2024/06/03 18:05

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);        }    }}