SpringFactoriesLoader是SpringBoot中专门加载META-INF/spring.factories文件内容的SPI加载工具
    spring.factories文件的内容为KV形式,如:

    1. org.springframework.context.ApplicationContextInitializer=\
    2. org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
    3. org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

    可以配置某个接口下需要加载哪些实现,多个用逗号隔开。

    SpringFactoriesLoader源码解析

    public abstract class SpringFactoriesLoader {
        // 加载路径及文件
        public static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
        // 缓存
        private static final Map<ClassLoader, MultiValueMap<String, String>> cache = new ConcurrentReferenceHashMap<>();
    
    
        public static <T> List<T> loadFactories(Class<T> factoryClass, @Nullable ClassLoader classLoader) {
            Assert.notNull(factoryClass, "'factoryClass' must not be null");
            // 确定加载器
            ClassLoader classLoaderToUse = classLoader;
            if (classLoaderToUse == null) {
                classLoaderToUse = SpringFactoriesLoader.class.getClassLoader();
            }
            // 加载解析得到文件内容
            List<String> factoryNames = loadFactoryNames(factoryClass, classLoaderToUse);
            if (logger.isTraceEnabled()) {
                logger.trace("Loaded [" + factoryClass.getName() + "] names: " + factoryNames);
            }
            // 对加载的类进行实例化
            List<T> result = new ArrayList<>(factoryNames.size());
            for (String factoryName : factoryNames) {
                // 反射实例化
                result.add(instantiateFactory(factoryName, factoryClass, classLoaderToUse));
            }
            // 排序
            AnnotationAwareOrderComparator.sort(result);
            return result;
        }
    
        // 根据类名加载
        public static List<String> loadFactoryNames(Class<?> factoryClass, @Nullable ClassLoader classLoader) {
            String factoryClassName = factoryClass.getName();
            // 具体的加载过程
            return loadSpringFactories(classLoader).getOrDefault(factoryClassName, Collections.emptyList());
        }
    
        // 执行加载
        private static Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader) {
            // 检查缓存
            MultiValueMap<String, String> result = cache.get(classLoader);
            if (result != null) {
                return result;
            }
    
            try {
                Enumeration<URL> urls = (classLoader != null ?
                        classLoader.getResources(FACTORIES_RESOURCE_LOCATION) :
                        ClassLoader.getSystemResources(FACTORIES_RESOURCE_LOCATION));
                // 遍历加载的资源
                result = new LinkedMultiValueMap<>();
                while (urls.hasMoreElements()) {
                    URL url = urls.nextElement();
                    UrlResource resource = new UrlResource(url);
                    // 解析为Properties
                    Properties properties = PropertiesLoaderUtils.loadProperties(resource);
                    for (Map.Entry<?, ?> entry : properties.entrySet()) {
                        //
                        List<String> factoryClassNames = Arrays.asList(
                                StringUtils.commaDelimitedListToStringArray((String) entry.getValue()));
                        result.addAll((String) entry.getKey(), factoryClassNames);
                    }
                }
                // 放入缓存
                cache.put(classLoader, result);
                return result;
            } catch (IOException ex) {
                throw new IllegalArgumentException("Unable to load factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
            }
        }
    // 省略部分代码....
    }