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>
等地方
阅读全文
0 0
- spring 读取 spring.factories
- Spring Boot No auto configuration classes found in META-INF/spring.factories
- Spring 资源读取问题
- 读取Spring配置文件
- spring读取xml配置
- dom4j读取spring配置文件
- spring 读取applicationContext方式
- spring 读取属性文件
- 读取Spring bean实例
- spring 读取资源文件
- Spring配置文件读取方式
- spring 读取资源文件
- spring 读取properties配置文件
- spring读取.properties
- spring读取applicationContext
- Spring读取配置文件
- Spring 读取 properties文件
- Spring读取配置文件路径
- 关于贪心算法的研究(论文)
- Qt Creator 中Uncrustify代码格式化配置
- java反射
- Linux Signal
- OpenGL系列教程之十:OpenGL帧缓冲区对象(FBO)
- spring 读取 spring.factories
- neutron安全组
- 单例模式
- Redis 讲解系列之 NoSql入门和概述(二)
- memdup_user()函数
- 使用QT调试ROS工程
- python实现二叉树以及二叉树的遍历--1(函数实现)
- 函数声明和函数表达式
- 一张图看学霸,杭州云栖大会前13位顶尖科学家聚会