1、从FileSystemAppllicationContext分析Spring对IOC容器的初始化过程
其类继承体系如下:
通常会调用refresh() 方法,它是IOC容器才初始化的入口。首先会去获取一个beanFactory,实际上为DefaultListableBeanFactory。它持有beanDefinitionMap,里面存储上一节提到的BeanDefinition,同时还有beanDefinitionNames、singletonObjects(用来存储实例化后的单实例对象)等对象。在此之前,还有很重要的一步,是调用refreshBeanFactory()方法,用来根据指定的路径找到resource文件,然后读取文件转换成spring的内部结构BeanDefinition,并且以key-value的形式存入到beanDefinitionMap,用来提供给后续实例化bean时使用。通过debug一下spring源代码里面的测试实例类WebApplicationContextScopeTests,便可以一目了然。如下图:
获取到beanFactory以后会进行一系列的预处理,包括context's class loader、MessageSource registered、post-processing等。重点在于finishBeanFactoryInitialization(beanFactory)方法,它会去实例化单实例、非延迟加载(spring 默认bean配置)的bean。首先会去beanDefinitionMap获取bean定义,然后调用getBean(beanName)去实例化bean,并将它放到DefaultListableBeanFactory的singletonObjects(map)中去。
整个IOC容器的初始化,大致是这个流程,具体spring还会支持各种属性配置,以及初始化前后支持的各种操作等。通过debug源代码,可以针对想要了解的细节及模块研究其实现原理。