spring 读取 spring.factories

来源:互联网 发布:java 返回前台值换行 编辑:程序博客网 时间:2024/06/14 20:02

大家都知道可以在在 META-INF/spring.factories 中配置

org.springframework.context.ApplicationContextInitializerorg.springframework.context.ApplicationListenerorg.springframework.boot.SpringApplicationRunListenerorg.springframework.boot.env.PropertySourceLoaderorg.springframework.boot.autoconfigure.template.TemplateAvailabilityProviderorg.springframework.test.contex.TestExecutionListenerorg.springframework.boot.autoconfigure.EnableAutoConfiguration

spring 怎么处理的呢?

是用SpringFactoriesLoader这个类处理的
public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {        Assert.notNull(factoryClass, "'factoryClass' must not be null");        ClassLoader classLoaderToUse = classLoader;        if(classLoader == 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());        Iterator var5 = factoryNames.iterator();        while(var5.hasNext()) {            String factoryName = (String)var5.next();            result.add(instantiateFactory(factoryName, factoryClass, classLoaderToUse));        }        AnnotationAwareOrderComparator.sort(result);        return result;    }    public static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {        String factoryClassName = factoryClass.getName();        try {            Enumeration<URL> urls = classLoader != null?classLoader.getResources("META-INF/spring.factories"):ClassLoader.getSystemResources("META-INF/spring.factories");            ArrayList result = new ArrayList();            while(urls.hasMoreElements()) {                URL url = (URL)urls.nextElement();                Properties properties = PropertiesLoaderUtils.loadProperties(new UrlResource(url));                String factoryClassNames = properties.getProperty(factoryClassName);                result.addAll(Arrays.asList(StringUtils.commaDelimitedListToStringArray(factoryClassNames)));            }            return result;        } catch (IOException var8) {            throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() + "] factories from location [" + "META-INF/spring.factories" + "]", var8);        }    }    private static <T> T instantiateFactory(String instanceClassName, Class<T> factoryClass, ClassLoader classLoader) {        try {            Class<?> instanceClass = ClassUtils.forName(instanceClassName, classLoader);            if(!factoryClass.isAssignableFrom(instanceClass)) {                throw new IllegalArgumentException("Class [" + instanceClassName + "] is not assignable to [" + factoryClass.getName() + "]");            } else {                Constructor<?> constructor = instanceClass.getDeclaredConstructor(new Class[0]);                ReflectionUtils.makeAccessible(constructor);                return constructor.newInstance(new Object[0]);            }        } catch (Throwable var5) {            throw new IllegalArgumentException("Unable to instantiate factory class: " + factoryClass.getName(), var5);        }    }
那么那里调用的呢?很多地方,比如
TemplateAvailabilityProviders.<init>
ConfigFileApplicationListener.loadPostProcessors
PropertySourcesLoader.<init>
等地方

原创粉丝点击