ioc容器的初始化主要包含三个过程:BeanDefinition的Resource定位,BeanDefinition解析和向ioc容器注册解析好BeanDefinition三大步骤。
三个步骤分别由不同的模块完成,方便用户扩展和调整,定义出最适合自己的ioc容器初始化过程
下面简要介绍下三个过程
第一个过程BeanDefinition的资源定位由ResourceLoader通过统一的Resource接口来完成,这个Resource对各种形式的BeanDefinition的存在提供了统一接口。常见的有FileSystemResource,ClassPathResource。
第二个过程BeanDefinition的载入,该载入过程把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。总地说来,这个BeanDefinition实际上就是POJO对象在IoC容器中的抽象,这个BeanDefinition定义了一系列的数据来使得IoC容器能够方便地对POJO对象也就是Spring的Bean进行管理。即BeanDefinition就是Spring的领域对象。
第三个过程是向IoC容器注册这些BeanDefinition的过程。这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的,这个注册过程把载入过程中解析得到的BeanDefinition向IoC容器进行注册。可以看到,在IoC容器内部,是通过使用一个HashMap来持有这些BeanDefinition数据的。
注意:ioc容器初始化一般不包含bean依赖注入过程,依赖注入一般发生成通过容器getBean的过程中。例外情况,如果希望在ioc容器初始化过程中就进行bean依赖注入过程,可以通过设置bean的lazyInit属性从而改变bean依赖注入过程时间点。