SpringBoot spring.factories加载时机分析|今日热文
目录
spring.factories作用源码解析用法

spring.factories作用

这个类似于Java中的SPI功能,SpringBoot启动的时候会读取所有jar包下面的META-INF/spring.factories文件;

并且将文件中的 接口/抽象类 对应的实现类都对应起来,并在需要的时候可以实例化对应的实现类


(资料图)

下面我们来分析一下源码看看spring.factories的使用场景

源码解析

启动SpringApplication,看看构造方法

public SpringApplication(ResourceLoader resourceLoader, Class... primarySources) {
		this.resourceLoader = resourceLoader;
		Assert.notNull(primarySources, "PrimarySources must not be null");
		this.primarySources = new LinkedHashSet<>(Arrays.asList(primarySources));
		this.webApplicationType = WebApplicationType.deduceFromClasspath();
		setInitializers((Collection) getSpringFactoriesInstances(
				ApplicationContextInitializer.class));
		setListeners((Collection) getSpringFactoriesInstances(ApplicationListener.class));
		this.mainApplicationClass = deduceMainApplicationClass();
	}

其中方法getSpringFactoriesInstances( ApplicationContextInitializer.class)是用于获取Spring中指定类实例用的;并且获取的时候是根据读取整个项目中文件路径为META-INF/spring.factories中的内容实例化对应的实例类的;

例如这里的ApplicationContextInitializer是一个接口,那么应该实例化哪些他的实现类呢?那就找META-INF/spring.factories文件 ; 那么我们在spring-boot:2.1.0jar包中找到了这个文件

读取到需要实例化的实现类为

org.springframework.boot.context.ConfigurationWarningsApplicationContextInitializer,\
org.springframework.boot.context.ContextIdApplicationContextInitializer,\
org.springframework.boot.context.config.DelegatingApplicationContextInitializer,\
org.springframework.boot.web.context.ServerPortInfoApplicationContextInitializer

并且还在spring-boot-autoconfigure-2.1.0.RELEASE.jar中找到了这个文件

那么文件中的两个实现类也会被实例化;加上上面4个总共有6个

org.springframework.boot.autoconfigure.SharedMetadataReaderFactoryContextInitializer,\
org.springframework.boot.autoconfigure.logging.ConditionEvaluationReportLoggingListener

可以看到不仅仅只是把org.springframework.context.ApplicationContextInitializer 的实例类解析了出来;而是所有的都解析了出来并且保存下来了.下次其他的类需要被实例化的时候就可以直接从内存里面拿了;

上面过程拿到了实例类之后,接下来就是实例化的过程了

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

方法createSpringFactoriesInstances就是创建实例的过程;可以看到传入了对应的接口类org.springframework.context.ApplicationContextInitializer ;接下来就会实例化 上面找到了对应的实现类;

private  List createSpringFactoriesInstances(Class type,
			Class[] parameterTypes, ClassLoader classLoader, Object[] args,
			Set names) {
		List 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;
	}

实例化的过程如果,没有什么特别需要讲解的;

上面有个方法AnnotationAwareOrderComparator.sort(instances);是用来排序所有实例的; 实现类需要实现 接口Ordered; getOrder返回的值越小,优先级更高

用法

知道spring.factories的用法之后, 那么我们就可以利用这个特性实现自己的目的;

例如我们也可以写一个接口类ApplicationContextInitializer的实现类;

等等之类的;

以上就是SpringBoot spring.factories加载时机分析的详细内容,更多关于spring.factories加载时机的资料请关注脚本之家其它相关文章!

标签:

x 广告
女生高考712分 查完分就睡觉 妈妈:女儿一直都挺乖的

女生高考712分查完分就睡觉妈妈:女儿一直都挺乖的

AI+时代:谁将赢得先机?

AI+时代:谁将赢得先机?记得阿基米德曾说过:“给我一个支点,我就能

全球滚动:什么是执法记录仪?智能音视频记录仪推荐

智能音视频记录仪是一种应用智能科技的设备,用于对警员及其他执法人员

让领先更领先,魅族 Aicy识图好用程度爆表,网友惊呼!

今日手机算力比前几年真不可同日而语,这也为手机开发各类功能提供了技

2023年北京高考志愿填报时间及入口公布

2023年北京高考录取志愿填报时间及入口2023年北京高考志愿填报查询时间

天天微资讯!扶老挈幼观舟去 飞桨逐浪劈波来——《艺术里的奥林匹克》带您共赏《观竞渡》中的民族体育盛会

柳荫下江岸边人们顶着骄阳翘首以盼远处的芦苇荡里一艘龙舟正伴着锣鼓劈

如何以创意方式打造清洁画布艺术品-男生生日礼物换新思路 天天日报

你需要的东西除尘布乳液清洁剂清漆去除剂棉签漆随着时间的推移,一

带着”一票否决权“报IPO,对赌协议改了3次最后关头终于清理完毕!

1 在前面的案例分析中,再结合市场上一些观点的整合,关于IPO对赌协议

富力地产这半年|今日最新

富力地产是中国企业中少见的“双老板”制。李思廉、张力分别持有这家公

翔安区新溪尾小学将开建 办学规模将达48个班级

厦门网讯(厦门晚报记者戴舒静)近日,厦门市自然资源和规划局核发了新

x 广告

Copyright ©  2015-2023 亚洲都市网版权所有  备案号:京ICP备2021034106号-51   联系邮箱:5 516 538 @qq.com