IoC容器的初始化过程

1.简单来说IoC容器的初始化是由前面介绍的refresh()方法来启动的,这个方法标志着IoC容器的正式启动

2.具体来说,这个启动包括BeanDefinition的Resource定位载入注册三个基本过程。

3.如果我们了解如何编程式地使用IoC容器,就可以清楚地看到Resource定位和载入过程的接口调用。

 

1.在分析之前,要提醒读者注意的是,Spring把这三个过程分开,并使用不同的模块来完成,如使用相应的ResourceLoader、BeanDefinitionReader等模块,通过这样的设计方式,可以让用户更加灵活地对这三个过程进行裁剪或扩展,定义出最适合自己的IoC容器的初始化过程

 

1.第一个过程是Resource定位过程。这个Resource定位指的是BeanDefinition的资源定位,它由ResourceLoader通过统一的Resource接口来完成,这个Resource各种形式的BeanDefinition的使用都提供了统一接口。对于这些BeanDefinition的存在形式,相信大家都不会感到陌生。比如,在文件系统中的Bean定义信息可以使用FileSystemResource来进行抽象;在类路径中的Bean定义信息可以使用前面提到的ClassPathResource来使用,等等。这个定位过程类似于容器寻找数据的过程,就像用水桶装水先要把水找到一样。

2.第二个过程是BeanDefinition的载入。这个载入过程把用户定义好的Bean表示成IoC容器内部的数据结构,而这个容器内部的数据结构就是BeanDefinition。下面介绍这个数据结构的详细定义。具体来说,这个BeanDefinition实际上就是POJO对象在IoC容器中的抽象,通过这个BeanDefinition定义的数据结构,使IoC容器能够方便地对POJO对象也就是Bean进行管理。在下面的章节中,我们会对这个载入的过程进行详细的分析,使大家对整个过程有比较清楚的了解。

3.第三个过程是向IoC容器注册这些BeanDefinition的过程。这个过程是通过调用BeanDefinitionRegistry接口的实现来完成的。这个注册过程把载入过程中解析得到BeanDefinition向IoC容器进行注册。通过分析,我们可以看到,在IoC容器内部BeanDefinition注入到一个HashMap中去,IoC容器就是通过这个HashMap来持有这些BeanDefinition数据的

 

 

1.值得注意的是,这里谈的是IoC容器的初始化过程,在这个过程中,一般不包含Bean依赖注入的实现

2.在Spring IoC的设计中,Bean定义载入依赖注入两个独立的过程

3.依赖注入一般发生在应用第一次通过getBean向容器索取Bean的时候。但有一个例外值得注意,在使用IoC容器时有一个预实例化的配置,通过这个预实例化的配置(具体来说,可以通过为Bean定义信息中的lazyinit属性),用户可以对容器初始化过程作一个微小的控制,从而改变这个被设置了lazyinit属性Bean依赖注入过程。举例来说,如果我们对某个Bean设置了lazyinit属性,那么这个Bean依赖注入IoC容器初始化时预先完成了。而不需要等到整个初始化完成以后,第一次使用getBean时才会触发。

 

了解了IoC容器进行初始化的大致轮廓之后,下面我们详细地介绍在IoC容器的初始化过程中,BeanDefinition的资源定位、载入和解析过程是怎么实现的。

 

posted @ 2014-09-15 10:21  行者无疆Duffy  阅读(413)  评论(0编辑  收藏  举报