在上一篇【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信息。