SpringFactoriesLoader

  查询META-INF/spring.factories的properties配置中指定class对应的所有实现类。

public abstract class SpringFactoriesLoader {
/** The location to look for the factories. Can be present in multiple JAR files. */
private static final String FACTORIES_RESOURCE_LOCATION = "META-INF/spring.factories";
private static final Log logger = LogFactory.getLog(SpringFactoriesLoader.class);
/**
* Loads the factory implementations of the given type from the default location, using
* the given class loader.
* <p>The returned factories are ordered in accordance with the {@link OrderComparator}.
* @param factoryClass the interface or abstract class representing the factory
* @param classLoader the ClassLoader to use for loading (can be {@code null} to use the default)
*/
public static <T> List<T> loadFactories(Class<T> factoryClass, ClassLoader classLoader) {
Assert.notNull(factoryClass, "'factoryClass' must not be null");
if (classLoader == null) {
classLoader = SpringFactoriesLoader.class.getClassLoader();
}
List<String> factoryNames = loadFactoryNames(factoryClass, classLoader);
if (logger.isTraceEnabled()) {
logger.trace("Loaded [" + factoryClass.getName() + "] names: " + factoryNames);
}
List<T> result = new ArrayList<T>(factoryNames.size());
for (String factoryName : factoryNames) {
result.add(instantiateFactory(factoryName, factoryClass, classLoader));
}
OrderComparator.sort(result);
return result;
}
private static List<String> loadFactoryNames(Class<?> factoryClass, ClassLoader classLoader) {
String factoryClassName = factoryClass.getName();
try {
List<String> result = new ArrayList<String>();
Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
while (urls.hasMoreElements()) {
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 ex) {
throw new IllegalArgumentException("Unable to load [" + factoryClass.getName() +
"] factories from location [" + FACTORIES_RESOURCE_LOCATION + "]", ex);
}
}
@SuppressWarnings("unchecked")
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() + "]");
}
return (T) instanceClass.newInstance();
}
catch (Throwable ex) {
throw new IllegalArgumentException("Cannot instantiate factory class: " + factoryClass.getName(), ex);
}
}

最新文章

  1. 如何打开、关闭IIS服务器
  2. CSS3新特性,绘制常见图形
  3. 使用socket.io开发简单群聊功能
  4. SQL语句执行时所发生的步骤
  5. SCOI2015题解 &amp;&amp; 考试小结
  6. 教师投票系统(JSP+MySQL)
  7. 深入理解MFC子类化
  8. python &lt;tab&gt;自动补全
  9. xmake v2.1.5版本正式发布,大量新特性更新
  10. 将控制台信息显示在前台页面的js插件
  11. [九]JavaIO之ObjectInputStream 和 ObjectOutputStream
  12. 三.HashMap原理及实现学习总结
  13. Android 软件管理工具类Utils
  14. CF520E Pluses everywhere
  15. 基于zookeeper的activemq的主从集群配置
  16. 2012 Dhaka
  17. MySQL事物系列:2:事物的实现
  18. mysql hive sql 进阶
  19. 使用Navicat导入excel表
  20. PAT Sign In and Sign Out[非常简单]

热门文章

  1. openvswitch 流表测试 ovs-appctl
  2. lombook插件的说明
  3. 第4篇 Scrum 冲刺博客(专✌️团队)
  4. 兄弟,你爬虫基础这么好,需要研究js逆向了,一起吧(有完整JS代码)
  5. muduo源码解析9-timezone类
  6. 用 Python 写个七夕表白神器
  7. 重拾Java Web应用的基础体系结构
  8. 轻轻松松学CSS:float
  9. 蒲公英 &#183; JELLY技术周刊 Vol.20: Vue3 极致优化——分析 Vue3 Compiler 告诉你为什么这么快
  10. 如何用python制作贪吃蛇以及AI版贪吃蛇