美文网首页
spring容器标签解析之qualifier

spring容器标签解析之qualifier

作者: 会上树的程序猿 | 来源:发表于2019-06-20 23:32 被阅读0次

前面的篇章中介绍了spring解析property子标签的过程,发现套路都是很接近的,接下来我们来看一下spring是如何解析子标签qualifier的,先来看一下qualifier的简单的利用

这里有一篇关于qualifier的caseSpring 注解实现Bean依赖注入之@Qualifier,感觉写的不错大家有兴趣的可以看看,接下来我们直接看spring是如何解析qualifier的过程:

/**
 * Parse qualifier sub-elements of the given bean element.
 */
public void parseQualifierElements(Element beanEle, AbstractBeanDefinition bd) {
    
    NodeList nl = beanEle.getChildNodes();
    for (int i = 0; i < nl.getLength(); i++) {
        Node node = nl.item(i);
        //遍历获取qualifier类型的
        if (isCandidateElement(node) && nodeNameEquals(node, QUALIFIER_ELEMENT)) {
            parseQualifierElement((Element) node, bd);
        }
    }
}

上述真正的解析qualifier的是方法parseQualifierElement,接着看:

/**
 * Parse a qualifier element.
 */
public void parseQualifierElement(Element ele, AbstractBeanDefinition bd) {
    //获取属性type
    String typeName = ele.getAttribute(TYPE_ATTRIBUTE);
    if (!StringUtils.hasLength(typeName)) {
        error("Tag 'qualifier' must have a 'type' attribute", ele);
        return;
    }
    //保存一个QualifierEntry实例
    this.parseState.push(new QualifierEntry(typeName));
    try {
        //封装AutowireCandidateQualifier
        AutowireCandidateQualifier qualifier = new AutowireCandidateQualifier(typeName);
        qualifier.setSource(extractSource(ele));
        String value = ele.getAttribute(VALUE_ATTRIBUTE);
        if (StringUtils.hasLength(value)) {
            qualifier.setAttribute(AutowireCandidateQualifier.VALUE_KEY, value);
        }
        NodeList nl = ele.getChildNodes();
        for (int i = 0; i < nl.getLength(); i++) {
            Node node = nl.item(i);
            if (isCandidateElement(node) && nodeNameEquals(node, QUALIFIER_ATTRIBUTE_ELEMENT)) {
                Element attributeEle = (Element) node;
                String attributeName = attributeEle.getAttribute(KEY_ATTRIBUTE);
                String attributeValue = attributeEle.getAttribute(VALUE_ATTRIBUTE);
                if (StringUtils.hasLength(attributeName) && StringUtils.hasLength(attributeValue)) {
                    BeanMetadataAttribute attribute = new BeanMetadataAttribute(attributeName, attributeValue);
                    attribute.setSource(extractSource(attributeEle));
                    qualifier.addMetadataAttribute(attribute);
                }
                else {
                    error("Qualifier 'attribute' tag must have a 'name' and 'value'", attributeEle);
                    return;
                }
            }
        }
        bd.addQualifier(qualifier);
    }
    finally {
        this.parseState.pop();
    }
}

上述就是解析qualifier的过程,spring对于子标签的解析的过程都是一样的套路,关于它的解析详解这里不想重复了,感兴趣自己可以去瞅瞅.

相关文章

网友评论

      本文标题:spring容器标签解析之qualifier

      本文链接:https://www.haomeiwen.com/subject/qihsqctx.html