比如,再往下看,我们看到像List这样的属性配置是怎样被解析的,依然在BeanDefinitionParserDelegate中:返回的是一个List对象,这个List是Spring定义的ManagedList,作为封装List这类配置定义的数据封装,如以下代码清单所示。
- public List parseListElement(Element collectionEle, BeanDefinition bd) {
- String defaultElementType = collectionEle.getAttribute(VALUE_TYPE_ATTRIBUTE);
- NodeList nl = collectionEle.getChildNodes();
- ManagedList<Object> target = new ManagedList<Object>(nl.getLength());
- target.setSource(extractSource(collectionEle));
- target.setElementTypeName(defaultElementType);
- target.setMergeEnabled(parseMergeAttribute(collectionEle));
- //具体的List元素的解析过程。
- parseCollectionElements(nl, target, bd, defaultElementType);
- return target;
- }
- protected void parseCollectionElements(
- NodeList elementNodes, Collection<Object> target, BeanDefinition bd, String defaultElementType) {
- //遍历所有的元素节点,并判断其类型是否为Element。
- for (int i = 0; i < elementNodes.getLength(); i++) {
- Node node = elementNodes.item(i);
- if (node instanceof Element && !DomUtils.nodeNameEquals(node, DESCRIPTION_ELEMENT)) {
- //加入到target中去,target是一个ManagedList,同时触发对下一层子元素的解析过程,这是一个递归的调用。
- target.add(parsePropertySubElement((Element) node, bd, defaultElementType));
- }
- }
- }
经过这样一层一层的解析,我们在XML文件中定义的BeanDefinition就被整个给载入到了IoC容器中,并在容器中建立了数据映射。在IoC容器中建立了对应的数据结构,或者说可以看成是POJO对象在IoC容器中的映像,这些数据结构可以以AbstractBeanDefinition为入口,让IoC容器执行索引、查询和操作。
在我的感觉中,对核心数据结构的定义和处理应该可以看成是一个软件的核心部分了。所以,这里的BeanDefinition的载入可以说是IoC容器的核心,如果说IoC容器是Spring的核心,那么这些BeanDefinition就是Spring的核心的核心了!
呵呵,这部分代码数量不小,但如果掌握这条主线,其他都可以举一反三吧,就像我们掌握了操作系统启动的过程,以及在操作系统设计中的核心数据结构像进程数据结构,文件系统数据结构,网络协议数据结构的设计和处理一样,对整个系统的设计原理,包括移植,驱动开发和应用开发,是非常有帮助的!