首先总结一下前面的知识,先介绍了一下spring的体系,又讲了一下自己对IOC的理解。今天开始,深入源码理解一下IOC的执行过程。
整体流程:
- 实例化容器:AnnotationConfigApplicationContext
- 实例化工厂:DefaultListableBeanFactory
- 实例化BeanDefinition 读取器:BeanDefinitionReader
- 创建BeanDefinition扫描器:BeanDefinitionScanner
- 注册配置类为一个BeanDefinition register(componentClasses)
-
refresh()
-
invokeBeanFactoryPostProcessors(beanFactory)
-
finishBeanFactoryInitialization(beanFactory);
今天来看第一个实例化容器
![](https://i-blog.csdnimg.cn/blog_migrate/f62e22e6e5531bb829ef22cb33e8ef3b.png)
可以看到它继承了ApplicationContext核心类。来看一下它的构造方法
public AnnotationConfigApplicationContext() {
this.reader = new AnnotatedBeanDefinitionReader(this);
this.scanner = new ClassPathBeanDefinitionScanner(this);
}
默认构造方法会实例化一个reader读取器和scanner扫描器。
- 由于继承GenericApplicationContext类,会先初始化一个beanFactory = new DefaultListableBeanFactory()
-
完成了spring内部BeanDefinition的注册(主要是后置处理器)
-
扫描包名的时候会用到
public AnnotationConfigApplicationContext(Class<?>... componentClasses) {
this();
register(componentClasses);
refresh();
}
- 这是一个有参构造方法可以接受多个配置类
- this()完成默认构造方法的事
-
refresh()注册传入的类,带@Configuration的配置类称之为传统配置类,不带的为普通bean
-
刷新方法以后介绍
总结:
AnnotationConfigApplicationContext的实例化调用父类生成默认bean 工厂,创建了一个读取器和扫描器。