IOC容器的初始化过程
这里谈的是IOC容器的初始化过程,不包括Bean的依赖注入的实现。SpringIOC的设计中,Bean的载入和依赖注入是两个独立的过程。依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。
IOC容器的初始化是由refresh()方法来启动的,这个启动包括BeanDefinition的Resource定位,载入和注册三个基本过程。
1. Resource定位过程
Resource定位指的是BeanDefinition的资源定位,由ResourceLoader通过统一的Resource接口完成。
2. BeanDefinition的载入
把用户定义好的Bean表示成IOC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。BeanDefinition实际上就是POJO对象在IOC容器中的抽象,通过BeanDefinition定义的数据结构,使IOC容器能够方便地对POJO进行管理。
IOC容器载入Bean的过程
3. 向IOC容器注册BeanDefinition
这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的。IOC容器内部将BeanDefinition注入到一个HashMap中,IOC容器就是通过这个HashMap来持有BeanDefinition数据的。
注册的调用过程
注意:
以上过程中IOC容器大致完成了管理Bean对象的数据准备工作,但是重要的依赖注入还没发生,此过程中IOC容器中的BeanDefinition中存在的还只是一些静态的配置信息。
依赖注入
依赖注入是用户第一次向IOC容器索要Bean时被触发的。当然也有例外,就是在BeanDefinition信息中通过控制lazy-init属性来让容器完成对Bean的预实例化。
依赖注入过程