1.创建一个新的AnnotationConfigApplicationContext,从给定的组件类派生bean定义,并自动刷新上下文。

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(MyConfig.class);

2. 可以看到AnnotationConfigApplicationContext的传入主配置类的构造方法:

    public AnnotationConfigApplicationContext(Class<?>... componentClasses) {this();
        register(componentClasses);
        refresh();
    }

3.点击this()方法

IOC容器的初始化过程---this()_IOC容器

 

4.首先会调用无参构造函数

IOC容器的初始化过程---this()_IOC容器_02

5.然后会调用AnnotationConfigApplicationContext的父类GenericApplicationContext的无参构造,初始化beanFactory(DefaultListableBeanFactory)

IOC容器的初始化过程---this()_IOC容器_03

6.同时也会调用AbstractApplicationContext的无参构造方法创建资源解析器

IOC容器的初始化过程---this()_IOC容器_04

7.以及DefaultResourceLoader的无参构造方法创建默认资源加载器

IOC容器的初始化过程---this()_IOC容器_05

8.最后再初始化注解模式下的BeanDefinition读取器,以及类路径下面的BeanDefinition扫描器

IOC容器的初始化过程---this()_IOC容器_06

9.至此this()执行完成,总结下:

this()通过调用无参的构造器,会调用父类的无参构造器GenericApplicationContext#GenericApplicationContext(),创建IOC容器

public GenericApplicationContext() {//创建IOC容器this.beanFactory = new DefaultListableBeanFactory();
}

调用自己的构造方法AnnotationConfigApplicationContext#AnnotationConfigApplicationContext(),给IOC赋值

public AnnotationConfigApplicationContext() {//为IOC容器赋值 AnnotatedBeanDefinitionReader(注解的Bean定义读取器)this.reader = new AnnotatedBeanDefinitionReader(this);//为IOC容器赋值 类路径下的bean定义扫描器this.scanner = new ClassPathBeanDefinitionScanner(this);
    }