• spring源码解析(3)-BeanDefinition


    BeanDefinition是一个接口,代表XML文档中<bean>元素的类表现形式,它有三个子类RootBeanDefinition,ChildBeanDefinition和GenericBeanDefinition。

    对<bean>元素的实际解析主要通过XmlBeanDefinitionReader、DefaultBeanDefinitionDocumentReader、BeanDefinitionParserDelegate这三个类
    主要用到了BeanDefinitionParserDelegate中的三个方法
    (1)public BeanDefinitionHolder parseBeanDefinitionElement(Element ele, @Nullable BeanDefinition containingBean) 
    //方法解析了id、name两个标签,并把其他标签交给另一个parseBeanDefinitionElement来处理
    (2)public AbstractBeanDefinition parseBeanDefinitionElement( Element ele, String beanName, 
    @Nullable BeanDefinition containingBean)
    //方法解析了class、parent两个标签,并把其他标签交给了下一个方法parseBeanDefinitionAttributes
    (3)public AbstractBeanDefinition parseBeanDefinitionAttributes(Element ele, 
    String beanName,@Nullable BeanDefinition containingBean, AbstractBeanDefinition bd)
    //方法对bean元素的剩下的各种标签进行了解析,包括scope、singleton、abstract、lazy-init、autowire、dependency-check、depends-on、primary、init-method、destroy-method、factory-method等
    //并将解析得到的信息存储到AbstractBeanDefinition抽象类中,这个类也实现了BeanDefinition接口。


    另外贴一下方法的源码,因为它除了解析了<bean>的一级标签外,在后面的调用中还解析了<meta><lookup-method><replaced-method><constructor-arg><property>
    <qualifier>等子标签,非常重要。
    public AbstractBeanDefinition parseBeanDefinitionElement(
                Element ele, String beanName, @Nullable BeanDefinition containingBean) {
    
            this.parseState.push(new BeanEntry(beanName));
    
            String className = null;
            if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
                className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
            }
            String parent = null;
            if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
                parent = ele.getAttribute(PARENT_ATTRIBUTE);
            }
    
            try {
                AbstractBeanDefinition bd = createBeanDefinition(className, parent);
    
                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);
                parsePropertyElements(ele, bd);
                parseQualifierElements(ele, bd);
    
                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;
        }

     想要了解解析后的到底拿到了哪些属性,可以看一下AbstractBeanDefinition类

  • 相关阅读:
    Direct hosting of SMB over TCP/IP
    学习 Linux,302(混合环境): 概念
    脚本
    linux加入windows域
    Internet传输协议-TCP
    vCenter Single Sign On 5.1 best practices
    Zoning and LUN Masking
    Fiber Channel SAN Storage
    How to check WWN and Multipathing on Windows Server
    在Windows中监视IO性能
  • 原文地址:https://www.cnblogs.com/wangbin2188/p/15266396.html
Copyright © 2020-2023  润新知