包括三个方面:BeanDefinition的Resource定位、载入和注册
Spring将此三个过程分开,并使用不同的模块来完成,如使用ResourceLoader、BeanDefinitionReader等模块,通过这样的设计方式,可以让用户更加灵活的对这三个过程进行裁剪和扩展,定义出最适合自己的IoC容器的初始化
具体:
1、Resource的定位
指的是BeanDefinition的资源定位,是由ResourceLoader通过统一的Resource接口来完成。这个Resource对各种形式的BeanDefinition的使用都提供了统一的接口。如:文件系统中的Bean的定义信息可以使用FileSystemResource来进行抽象;类路径中的Bean定义信息可以使用ClassPathResource来使用。
2、BeanDefinition的载入
把用户定义好的Bean(可以是文件中的资源,也可以是在java中自定义的对象)表示成IoC容器内部的数据结构,而IoC容器内部的数据结构是指BeanDefinition。BeanDefinition指的是POJO对象在IoC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IoC容器能够方便的对POJO对象进行管理。
3、向IoC容器注册BeanDefinition
通过调用BeanDefinitionregistry接口来实现。在IoC容器内部将BeanDefinition注入到HashMap中,IoC容器就是通过这个HashMap来持有这些Beandenifition数据的。
注意:
1、以上说的是IoC容器的初始化。这个过程中不包括bean依赖的注入。在Spring IoC中,Bean定义的载入和依赖的注入是两个独立的过程。依赖的注入一般发生在应用第一次通过getBean向勇气索取Bean的时候。
2、IoC有一个预实例化的配置,在Bean上设置lazyint属性,这个Bean的依赖注入在IoC容器初始化时就预先完成了,而不是等到整个初始化完成之后,第一次使用getBean时才触发。
参考文献:Spring技术内幕(第二版)计文柯 机械工业出版社