【springboot源码分析】2.加载sources类BeanDefinition


在上一篇【springboot源码分析】SpringApplication实例化main函数里面有这么一行代码

 SpringApplication.run(RpcClientApplication.class, args)

这篇文章的主角sources就是RpcClientApplication.class,之所以是sources是因为,springboot可以多个sources一起启动,也就是run还有一个重载方法可以传一个sources数组。


springboot对类注入以及自动装配源头就是解析sources,要想解析sources第一步,无可厚非的需要sources加载得到其BeanDefinition。

prepareContext(context, environment, listeners, applicationArguments,printedBanner);

上面一行代码是加载sources的BeanDefinition的入口


prepareContext方法体为

private void prepareContext(ConfigurableApplicationContext context,
			ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,
			ApplicationArguments applicationArguments, Banner printedBanner) {
		......
		// Load the sources
		Set<Object> sources = getAllSources();
		Assert.notEmpty(sources, "Sources must not be empty");
		load(context, sources.toArray(new Object[0]));
		......
	}

load(context, sources.toArray(new Object[0]))就是要加载sources的BeanDefinition。


跟踪进入AnnotatedBeanDefinitionReader.doRegisterBean(…)的方法体

<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
			@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {

	AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
	if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
		return;
	}

	abd.setInstanceSupplier(instanceSupplier);
	ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
	abd.setScope(scopeMetadata.getScopeName());
	String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));

	AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
	if (qualifiers != null) {
		for (Class<? extends Annotation> qualifier : qualifiers) {
			if (Primary.class == qualifier) {
				abd.setPrimary(true);
			}
			else if (Lazy.class == qualifier) {
				abd.setLazyInit(true);
			}
			else {
				abd.addQualifier(new AutowireCandidateQualifier(qualifier));
			}
		}
	}
	for (BeanDefinitionCustomizer customizer : definitionCustomizers) {
		customizer.customize(abd);
	}

	BeanDefinitionHolder definitionHolder = new BeanDefinitionHolder(abd, beanName);
	definitionHolder = AnnotationConfigUtils.applyScopedProxyMode(scopeMetadata, definitionHolder, this.registry);
	BeanDefinitionReaderUtils.registerBeanDefinition(definitionHolder, this.registry);
}

这里需要注意的是sources的BeanDefinition实际类型是AnnotatedGenericBeanDefinition,在之后对sources进行解析的时候很重要的。执行完doRegisterBean之后,就可以在DefaultListableBeanFactory中看到sources的BeanDefinition信息。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章