spring IOC 之篇三:默认标签的解析

private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
        // 对import标签的处理
        if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
            importBeanDefinitionResource(ele);
        }
        // 对alias标签的处理
        else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
            processAliasRegistration(ele);
        }
        // 对bean标签的处理
        else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
            processBeanDefinition(ele, delegate);
        }
        // 对beans的标签的处理
        else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
            // recurse
            doRegisterBeanDefinitions(ele);
        }
    }

这里主要分新bean标签的处理,其他都类似

/**
     * Process the given bean element, parsing the bean definition
     * and registering it with the registry.
     */
    protected void processBeanDefinition(Element ele, BeanDefinitionParserDelegate delegate) {      
// 首先委托 BeanDefinitionParserDelegate 类的parseBeanDefinitionElement方法进行元素的解析,返回实例BeanDefinitionHolder 对象,经过这个方法后,bdHolder实例已经包含我们配置的配置文件中的各种属性了,列如:class,id,alias之类的属性了。
        BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
        if (bdHolder != null) {
// 当返回的BeanDefinitionHolder对象实例 bdHolder不为空的情况下若存在默认标签的字节点下再有自定义属性,还需要再次对自定义属性进行解析。
            bdHolder = delegate.decorateBeanDefinitionIfRequired(ele, bdHolder);
            try {
                // Register the final decorated instance.
//解析完成后,需要对解析后的bdHolder进行注册,同样,注册操作委托给了BeanDefinitionReaderUtils的registerBeanDefinition方法。
                BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
            }
            catch (BeanDefinitionStoreException ex) {
                getReaderContext().error("Failed to register bean definition with name '" +
                        bdHolder.getBeanName() + "'", ele, ex);
            }
            // Send registration event.
//最后发出响应事件,通知相关的监听器,这个bean已经加载完成了。
            getReaderContext().fireComponentRegistered(new BeanComponentDefinition(bdHolder));
        }
    }

猜你喜欢

转载自www.cnblogs.com/histlyb/p/8977554.html