注意:在解析
上面方法中一些对一些配置如元信息(meta)、qualifier等的解析,我们在Spring中配置时使用的也不多,我们在使用Spring的
5.BeanDefinitionParserDelegate解析
BeanDefinitionParserDelegate在解析
- //解析
元素中的 子元素 public void parsePropertyElements(Element beanEle, BeanDefinition bd) { - //获取
元素中所有的子元素 NodeList nl = beanEle.getChildNodes(); - for (int i = 0; i < nl.getLength(); i++) { Node node = nl.item(i);
- //如果子元素是
子元素,则调用解析 子元素方法解析 if (isCandidateElement(node) && nodeNameEquals(node, PROPERTY_ELEMENT)) { - parsePropertyElement((Element) node, bd); }
- } }
- //解析
元素 public void parsePropertyElement(Element ele, BeanDefinition bd) { - //获取
元素的名字 String propertyName = ele.getAttribute(NAME_ATTRIBUTE); - if (!StringUtils.hasLength(propertyName)) { error(Tag 'property' must have a 'name' attribute, ele);
- return; }
- this.parseState.push(new PropertyEntry(propertyName)); try {
- //如果一个Bean中已经有同名的property存在,则不进行解析,直接返回。 //即如果在同一个Bean中配置同名的property,则只有第一个起作用
- if (bd.getPropertyValues().contains(propertyName)) { error(Multiple 'property' definitions for property ' + propertyName + ', ele);
- return; }
- //解析获取property的值 Object val = parsePropertyValue(ele, bd, propertyName);
- //根据property的名字和值创建property实例 PropertyValue pv = new PropertyValue(propertyName, val);
- //解析
元素中的属性 parseMetaElements(ele, pv); - pv.setSource(extractSource(ele)); bd.getPropertyValues().addPropertyValue(pv);
- } finally {
- this.parseState.pop(); }
- } //解析获取property值
- public Object parsePropertyValue(Element ele, BeanDefinition bd, String propertyName) { String elementName = (propertyName != null)
-
element for property ' + propertyName + ' : element; - //获取
的所有子元素,只能是其中一种类型:ref,value,list等 NodeList nl = ele.getChildNodes(); - Element subElement = null; for (int i = 0; i < nl.getLength(); i++) {
- Node node = nl.item(i); //子元素不是description和meta属性
- if (node instanceof Element && !nodeNameEquals(node, DESCRIPTION_ELEMENT) && !nodeNameEquals(node, META_ELEMENT)) {
- if (subElement != null) { error(elementName + must not contain more than one sub-element, ele);
- } else {//当前
元素包含有子元素 - subElement = (Element) node; }
- } }
- //判断property的属性值是ref还是value,不允许既是ref又是value boolean hasRefAttribute = ele.hasAttribute(REF_ATTRIBUTE);
- boolean hasValueAttribute = ele.hasAttribute(VALUE_ATTRIBUTE); if ((hasRefAttribute && hasValueAttribute) ||
- ((hasRefAttribute || hasValueAttribute) && subElement != null)) { error(elementName +
- is only allowed to contain either 'ref' attribute OR 'value' attribute OR sub-element, ele); }
- //如果属性是ref,创建一个ref的数据对象RuntimeBeanReference,这个对象 //封装了ref信息
- if (hasRefAttribute) { String refName = ele.getAttribute(REF_ATTRIBUTE);
- if (!StringUtils.hasText(refName)) { error(elementName + contains empty 'ref' attribute, ele);
- } //一个指向运行时所依赖对象的引用
- RuntimeBeanReference ref = new RuntimeBeanReference(refName); //设置这个ref的数据对象是被当前的property对象所引用
- ref.setSource(extractSource(ele)); return ref;
- } //如果属性是value,创建一个value的数据对象TypedStringValue,这个对象
- //封装了value信息 else if (hasValueAttribute) {
- //一个持有String类型值的对象 TypedStringValue valueHolder = new TypedStringValue(ele.getAttrib