如果我有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.conditionEvalua