解析Spring源码(8)--BeanDefinitionParserDelegate

来源:互联网 发布:中科恒业医学软件 编辑:程序博客网 时间:2024/06/14 09:57
    /**     * Parses the supplied {@code <bean>} element. May return {@code null}     * if there were errors during parse. Errors are reported to the     * {@link org.springframework.beans.factory.parsing.ProblemReporter}.     */    public BeanDefinitionHolder parseBeanDefinitionElement(Element ele) {        return parseBeanDefinitionElement(ele, null);    }
    /**     * 封装beanDefinition,beanName的BeanDefinitionHolder对象     * Parses the supplied {@code <bean>} element. May return {@code null}     * if there were errors during parse. Errors are reported to the     * {@link org.springframework.beans.factory.parsing.ProblemReporter}.     */    public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, BeanDefinition containingBean) {        String id = ele.getAttribute(ID_ATTRIBUTE);//helloWorldService        String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);//空""        List<String> aliases = new ArrayList<>();        if (StringUtils.hasLength(nameAttr)) {            String[] nameArr = StringUtils.tokenizeToStringArray(nameAttr, MULTI_VALUE_ATTRIBUTE_DELIMITERS);            aliases.addAll(Arrays.asList(nameArr));        }        String beanName = id;        if (!StringUtils.hasText(beanName) && !aliases.isEmpty()) {            beanName = aliases.remove(0);            if (logger.isDebugEnabled()) {                logger.debug("No XML 'id' specified - using '" + beanName +                        "' as bean name and " + aliases + " as aliases");            }        }        if (containingBean == null) {            checkNameUniqueness(beanName, aliases, ele);//可以忽略这不操作        }        //返回AbstractBeanDefinition对象,属性进行了初始化resource,beanClassName        AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);        if (beanDefinition != null) {            if (!StringUtils.hasText(beanName)) {//false                try {                    if (containingBean != null) {                        beanName = BeanDefinitionReaderUtils.generateBeanName(                                beanDefinition, this.readerContext.getRegistry(), true);                    }                    else {                        beanName = this.readerContext.generateBeanName(beanDefinition);                        // Register an alias for the plain bean class name, if still possible,                        // if the generator returned the class name plus a suffix.                        // This is expected for Spring 1.2/2.0 backwards compatibility.                        String beanClassName = beanDefinition.getBeanClassName();                        if (beanClassName != null &&                                beanName.startsWith(beanClassName) && beanName.length() > beanClassName.length() &&                                !this.readerContext.getRegistry().isBeanNameInUse(beanClassName)) {                            aliases.add(beanClassName);                        }                    }                    if (logger.isDebugEnabled()) {                        logger.debug("Neither XML 'id' nor 'name' specified - " +                                "using generated bean name [" + beanName + "]");                    }                }                catch (Exception ex) {                    error(ex.getMessage(), ele);                    return null;                }            }            String[] aliasesArray = StringUtils.toStringArray(aliases);            //封装beanDefinition,beanName的BeanDefinitionHolder对象            return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);        }        return null;    }
    /**     * 返回AbstractBeanDefinition,属性进行了初始化resource,beanClassName     * Parse the bean definition itself, without regard to name or aliases. May return     * {@code null} if problems occurred during the parsing of the bean definition.     */    public AbstractBeanDefinition parseBeanDefinitionElement(            Element ele, String beanName, BeanDefinition containingBean) {        //new BeanEntry(beanName),一个封装beanName的简单类        //parseState构建的一个栈,以stack作为底层存储结构,private final Stack<Entry> state;        this.parseState.push(new BeanEntry(beanName));        String className = null;        if (ele.hasAttribute(CLASS_ATTRIBUTE)) {            //com.test.HelloWorldService            className = ele.getAttribute(CLASS_ATTRIBUTE).trim();//去掉前后空白;        }        try {            String parent = null;            if (ele.hasAttribute(PARENT_ATTRIBUTE)) {//false                parent = ele.getAttribute(PARENT_ATTRIBUTE);            }            //创建GenericBeanDefinition bd对象,设置了beanclassName属性bd.setBeanClassName(className);            AbstractBeanDefinition bd = createBeanDefinition(className, parent);            //containingBean=null,对bd的属性进行设置,因为我们的例子没有这些属性所以基本没干啥            parseBeanDefinitionAttributes(ele, beanName, containingBean, bd);            bd.setDescription(DomUtils.getChildElementValueByTagName(ele, DESCRIPTION_ELEMENT));            parseMetaElements(ele, bd);            parseLookupOverrideSubElements(ele, bd.getMethodOverrides());            parseReplacedMethodSubElements(ele, bd.getMethodOverrides());            parseConstructorArgElements(ele, bd);            //子节点<property name="text" value="Hello World!"></property>            parsePropertyElements(ele, bd);//给bd添加属性,            parseQualifierElements(ele, bd);            //重要的是属性resource,            bd.setResource(this.readerContext.getResource());            bd.setSource(extractSource(ele));            return bd;        }        catch (ClassNotFoundException ex) {            error("Bean class [" + className + "] not found", ele, ex);        }        catch (NoClassDefFoundError err) {            error("Class that bean class [" + className + "] depends on not found", ele, err);        }        catch (Throwable ex) {            error("Unexpected failure during bean definition parsing", ele, ex);        }        finally {            this.parseState.pop();        }        return null;    }
    /**     * <property name="text" value="Hello World!"></property>     * PROPERTY_ELEMENT="property"     *      * Parse property sub-elements of the given bean element.     */    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);            }        }    }
    /**     * //给bd添加属性     *      * <property name="text" value="Hello World!"></property>     *      * Parse a property element.     */    public void parsePropertyElement(Element ele, BeanDefinition bd) {        String propertyName = ele.getAttribute(NAME_ATTRIBUTE);//text        if (!StringUtils.hasLength(propertyName)) {            error("Tag 'property' must have a 'name' attribute", ele);            return;        }        this.parseState.push(new PropertyEntry(propertyName));//入栈        try {            if (bd.getPropertyValues().contains(propertyName)) {                error("Multiple 'property' definitions for property '" + propertyName + "'", ele);                return;            }            Object val = parsePropertyValue(ele, bd, propertyName);//获取value值,并封装            PropertyValue pv = new PropertyValue(propertyName, val);            parseMetaElements(ele, pv);//本例不作为            pv.setSource(extractSource(ele));            bd.getPropertyValues().addPropertyValue(pv);//给bd添加属性        }        finally {            this.parseState.pop();//将属性名name="text"出栈        }    }

至此结束!

0 0
原创粉丝点击