AnnotationConfigApplicationContext
public AnnotationConfigApplicationContext() {
// 在执行此行代码之前, 先执行了父类的构造方法
// 此段代码做的事情:
// 1. 初始化bean工厂
// 2. 初始化一个注解BeanDefinition读取器
// 3. 将spring内置的6个类封装成RootBeanDefinition并注册到bean工厂,
// 具体是哪6个类可以查看上述的原理图
this.reader = new AnnotatedBeanDefinitionReader(this);
// 并没啥用, 虽然ClassPathBeanDefinitionScanner
// 类的作用是扫描@ComponentScan注解提供的包路径。
// 但实际上它并没有做扫描工作, spring内部扫描路径
// 的时候, 是在内部新new了一个ClassPathBeanDefinitionScanner,
// 这个属性目前没啥用, 当然我们可以获取这个对象
// 调用它的scan方法, 但是没有必要! 因为
// @ComponentScan可以支持多个扫描路径。
// 那这个类有什么用呢?跟刚刚的解释一样,
// 我们可以自己new一个ClassPathBeanDefinitionScanner对象或者扩展他,
// 利用它的扫描功能(因为它是使用ASM来扫描的)
// Mybatis源码中就是自己扩展了
// ClassPathBeanDefinitionScanner类
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
this方法调用的是这个AnnotationConfigApplicationContext方法的无参构造,在调用这个方法之前会调用他的父类方法的无参构造
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
AnnotationConfigApplicationContext父类GenericApplicationContext无参构造方法
public GenericApplicationContext() {
// 实例化spring bean工厂: DefaultListableBeanFactory
this.beanFactory = new DefaultListableBeanFactory();
}