如果我有8小时的时间砍一棵树,我就会花费6小时磨利自己的斧子。”
——亚伯拉罕·林肯
public AnnotationConfigApplicationContext(Class<?>... annotatedClasses) {
this();
//本节分析的步骤
register(annotatedClasses);
refresh();
}
上一节结束了Spring容器创建过程的分析,本节就是容器的初始化工作register(annotatedClasses)。
@EnableAutoConfiguration
@ComponentScan("com.Hodey")
public class CaseApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext ctx =
new AnnotationConfigApplicationContext(CaseApplication.class);
GardenofEden garden = ctx.getBean(GardenofEden.class);
garden.sayHello();
}
}
容器的初始化需要用户提供一个配置类,容器会将配置类进行注册。这个类一般情况下,就是你的启动类。Spring是支持用户提供多个配置类进行注册的,这里我们仅注册了一个配置类CaseApplication.class。这样在做doRegisterBean的时候传参等同于doRegisterBean(AutoInject.class, null, null, null);进入doRegisterBean方法(BeanDefinitionCustomizer... definitionCustomizers是可选参数).
<T> void doRegisterBean(Class<T> annotatedClass, @Nullable Supplier<T> instanceSupplier, @Nullable String name,
@Nullable Class<? extends Annotation>[] qualifiers, BeanDefinitionCustomizer... definitionCustomizers) {
//1.将CaseApplication.class解析后成为一个注解类型的bd。
AnnotatedGenericBeanDefinition abd = new AnnotatedGenericBeanDefinition(annotatedClass);
if (this.conditionEvaluator.shouldSkip(abd.getMetadata())) {
return;
}
abd.setInstanceSupplier(instanceSupplier);
//2.得出abd的scope属性。
ScopeMetadata scopeMetadata = this.scopeMetadataResolver.resolveScopeMetadata(abd);
abd.setScope(scopeMetadata.getScopeName());
String beanName = (name != null ? name : this.beanNameGenerator.generateBeanName(abd, this.registry));
//3.通用注解的解析
AnnotationConfigUtils.processCommonDefinitionAnnotations(abd);
if (qualifiers != null) {
for (Class<? extends Annotation> qualifier : qualifie