AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
看看AnnotationConfigApplicationContext类的构造方法都干了什么
/**
* 容器启动 传入配置类class数组
*/
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
//调用空参构造
this();
//将参数bean注册到容器中
register(componentClasses);
//刷新容器
refresh();
}
1.空参构造
/**
* 空参构造
*/
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
这里实例化了一个AnnotatedBeanDefinitionReader和一个ClassPathBeanDefinitionScanner。他们的构造方法如下:
/**
* 根据BeanDefinitionRegistry构造一个AnnotatedBeanDefinitionReader
*/
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
this(registry, getOrCreateEnvironment(registry));
}
/**
* 根据BeanDefinitionRegistry构建ClassPathBeanDefinitionScanner
*/
public ClassPathBeanDefinitionScanner(BeanDefinitionRegistry registry) {
this(registry, true);
}
可以看到这里传入的是一个BeanDefinitionRegistry,而AnnotationConfigApplicationContext在创建这两个对象的时候传入的是this,也就是AnnotationConfigApplicationContext对象,我们看一下这个类的定义
public class AnnotationConfigApplicationContext extends GenericApplicationContext implements AnnotationConfigRegistry {}
public class GenericApplicationContext extends AbstractApplicationContext implements BeanDefinitionRegistry {}
发现其父类GenericApplicationContext实现了BeanDefinitionRegistry接口,所以这里能够直接用this来构造出AnnotatedBeanDefinitionReader和ClassPathBeanDefinitionScanner对象。附图:

2.AnnotatedBeanDefinitionReader初始化时都干了什么
/**
* 根据BeanDefinitionRegistry构造一个AnnotatedBeanDefinitionReader
*/
public AnnotatedBeanDefinitionReader(BeanDefinitionRegistry registry) {
this(registry, getOrCreateEnvironment(registry));
}
这里的构造方法是直接调用的另一个构造方法,我们先看一下getOrCreateEnvironment做了什么

本文深入探讨了Spring的`AnnotationConfigApplicationContext`构造方法,分析了其在空参构造时如何通过`AnnotatedBeanDefinitionReader`和`ClassPathBeanDefinitionScanner`初始化。同时,详细讲解了`AnnotatedBeanDefinitionReader`的初始化过程,包括注册后置处理器的步骤,以及`ClassPathBeanDefinitionScanner`的构造和默认过滤器的注册。
最低0.47元/天 解锁文章
979

被折叠的 条评论
为什么被折叠?



