code: public void parseQualifierElement(Element ele, AbstractBeanDefinition bd) {
      String typeName = ele.getAttribute(TYPE_ATTRIBUTE);
      if (!StringUtils.hasLength(typeName)) {
        error("Tag 'qualifier' must have a 'type' attribute", ele);
        return;
      }
      this.parseState.push(new QualifierEntry(typeName));
      try {
        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 (node instanceof Element && 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();
      }
    }
docs: Parse a qualifier element.
  
  @param ele a {@link org.w3c.dom.Element} object.
  @param bd a {@link org.springframework.beans.factory.support.AbstractBeanDefinition} object.