IoC容器初始化过程
本文主要摘录于 Spring技术内幕-深入即系Spring架构和设计原理(许文柯著)。
IoC容器的初始化包括BeanDefinition的Resource定位、载入和注册三个基本过程。
一、BeanDefinition的Resource定位
还是以FileSystemXmlApplicationContext为例,上图表示了它的继承关系,可以看出它间接继承了DefaultResourceLoader类,因此具备了ResourceLoader读入以Resource定义的BeanDefinition的能力。IoC容器的初始化是从它的构造函数中的refresh方法开始的。
refresh方法调用AbstractRefreshableApplicationContext里的refreshBeanFactory方法,通过createBeanFactory构建了一个IoC容器供ApplicationContext使用,这个容器其实就是DefaultListableBeanFactory。同时启动loadBeanDefinitions来载入BeanDefinition,在AbstractBeanDefinitionReader里面找到合适的ResourceLoader解析Resource。这就是BeanDefinition的Resource定位。
二、BeanDefinition的载入和解析
上文中说到AbstractRefreshableApplicationContext类中refreshBeanFactory方法,启动loadBeanDefinitions来载入BeanDefinition,第一步获得XmlBeanDefinitionReader对象,然后再调用loadBeanDefinitions方法,源码如下:
实际上就是通过XmlBeanDefinitionReader对象去载入和解析BeanDefinition,最后通过BeanDefinitionParserDelegate去解析XML。这个时候容器还没有完全起作用,最后还需完成数据向容器的注册。
三、BeanDefinition在IoC容器中的注册
跟踪代码,注册其实就是调用DefaultListableBeanFactory里面的registerBeanDefinition方法,本质上是通过HashMap来持有载入的BeanDefinition,即DefaultListableBeanFactory中的beanDefinitionMap。完成了BeanDefinition的注册,就完成了IoC容器的初始化过程。此时,在使用的IoC容器DefaultListableBeanFactory中已经建立了整个Bean的配置信息,而且这些BeanDefinition已经可以被容器使用了。容器的作用就是对这些信息进行处理和维护,这些信息是容器建立依赖反转的基础。