IOC初始化过程
解析
涉及接口
上一章,我们知道了SpringIOC的容器启动前对resource(配置信息)的定位过程,在最后loadBeanDefinitions(resource)中由
XmlBeanDefinitionReader 打开Resource I/O流,从而获得XML的文件对象,进行真正的XML解析来获得Document对象,代码如下:
doLoadBeanDefinitions方法中doLoadDocument进行第一层解析。将I/O中的数据解析成Document文档,
这个过程交给了DefaultDocumentLoader来处理,
其中通过JDK的
javax.xml.parsers.DocumentBuilderFactory构建了
DocumentBuilder来解析
解析好Document文档后,registerBeanDefinitions(doc,resource)启动对BeanDefinition解析的详细过程,这个解析就会依照Bean配置规则去解析,也是我们下面详细记录的内容
这个工作是交给BeanDefinitionDocumentReader来完成的
registerBeanDefinitions调用实际处理方法doRegisterBeanDefinitions(Element root)
通过对Document文档树的内容进行处理,将结果交由BeanDefinitionHolder对象来持有,BeanDefinitionHolder除了持有BeanDefinition对象外,还持有其他与该BeanDefinition的使用相关的信息,比如Bean的名字、别名集合等。具体在processBeanDefinition方法中实现。
在这里会看到对那些熟系的BeanDefinition定义的处理,比如id、name、aliase\d等属元素,把这些元素的值从XML中读取出来以后,设置到生成的BeanDefinitionHolder中去,对于其他元素配置的解析,比如各种Bean的属性配置,通过一个较为复杂的解析过程,这个过程由parseBeanDefinitionElement来完成的,解析完成后,会把解析结果放到BeanDefinition对象中并设置到BeanDefinitionHolder中去。
进入parseBeanDefinitionElement
上面是具体生成BeanDefinition的地方,在这里,我们看一看对property进行的解析
- 这里取得property元素的值,也许是一个list或其他
*/
@Nullable
public Object parsePropertyValue(Element ele, BeanDefinition bd, @Nullable String propertyName)
这里是对property子元素的解析过程,Array,List,Set,Map,prop等各种元素都会在这里进行解析,生成对应的数据对象,比如ManagedList,ManagedArray,ManagedSet等,这些Managed类是spring对具体的BeanDefinition的数据封装。可以去查看自己感兴趣的部分,具体的解析方法在BeanDefinitionParserDelegate类中都能找到。
经过逐层的解析,我们在XML文件中定义的BeanDefinition就被整个载入到IOC容器中,并在容器中建立了数据映射。在ioc容器中建立了对应的数据结构,这些数据结构可以以AbstractBeanDefinition为入口,让IOC直行索引、查询和操作。经过以上的载入过程。IOC容器大致完成了管理Bean对象的数据准备工作,或者说是初始化过程,但是,重要的依赖注入实际上还没有发生,现在IOC容器BeanDefinition中存在的还只是一些静态配置信息,还没有完全起作用,要完全发挥容器的作用,还需要完成数据向容器的注册,将在下一章记录。