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做了什么
/**
* 根据BeanDefini