SpringBoot 基础概念:SpringApplication#getSpringFactoriesInstances

SpringBoot 基础概念:SpringApplication#getSpringFactoriesInstances

SpringApplication#getSpringFactoriesInstances

private <T> Collection<T> getSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes, Object... args) {
   
	ClassLoader classLoader = getClassLoader();
	// Use names and ensure unique to protect against duplicates
	Set<String> names = new LinkedHashSet<>(SpringFactoriesLoader.loadFactoryNames(type, classLoader));
	List<T> instances = createSpringFactoriesInstances(type, parameterTypes, classLoader, args, names);
	AnnotationAwareOrderComparator.sort(instances);
	return instances;
}

private <T> List<T> createSpringFactoriesInstances(Class<T> type, Class<?>[] parameterTypes,
		ClassLoader classLoader, Object[] args, Set<String> names) {
   
	List<T> instances = new ArrayList<>(names.size());
	for (String name : names) {
   
		try {
   
			Class<?> instanceClass = ClassUtils.forName(name, classLoader);
			Assert.isAssignable(type, instanceClass);
			Constructor<?> constructor = instanceClass.getDeclaredConstructor(parameterTypes);
			T instance = (T) BeanUtils.instantiateClass(constructor, args);
			instances.add(instance);
		}
		catch (Throwable ex) {
   
			throw new IllegalArgumentException("Cannot instantiate " + type + " : " + name, ex);
		}
	}
	return instances;
}
  1. 从方法名称就能知道,这个方法是得到spring.factories文件的实例化对象
    在这里插入图片描述

  2. 参数:type的类名为key,也就是上图黄色的部分,真正实例化的类是上图中绿色的部分。parameterTypes为构造器的参数类型。args为构造方法中参数的值。

  3. 获取到ClassLoader,通过ClassLoader加载到所有的META-INF/spring.factories文件资源。Properties#load拿到key value信息,type为key(途中黄色部分),value逗号分隔返回Set去重后的类名。通过反射创建实例。

  4. 在解析spring.factories文件的过程中,第一次就将所有的spring.factories文件加载了,对classLoader进行了缓存,避免重复加载创建多个实例。

  5. 在SpringBoot启动的过程中,spring.factories资源在一开始就被解析了。

相关推荐

  1. SpringBoot 基础概念:注册BeanDefinition

    2023-12-15 16:38:04       45 阅读
  2. springboot开发】PO、DTO等对象的基本概念

    2023-12-15 16:38:04       18 阅读
  3. SpringBoot-基础

    2023-12-15 16:38:04       21 阅读
  4. springboot基础

    2023-12-15 16:38:04       12 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-15 16:38:04       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-15 16:38:04       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-15 16:38:04       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-15 16:38:04       18 阅读

热门阅读

  1. 【代码随想录】刷题笔记Day36

    2023-12-15 16:38:04       28 阅读
  2. Android 长按电源键弹出的GlobalActions菜单

    2023-12-15 16:38:04       38 阅读
  3. android webrtc入门教程一(简单一对一通话实现)

    2023-12-15 16:38:04       39 阅读
  4. linux下查看日志命令

    2023-12-15 16:38:04       37 阅读
  5. python进阶:深入理解迭代器和生成器

    2023-12-15 16:38:04       35 阅读