zoukankan      html  css  js  c++  java
  • BeanDefinition的创建(BeanDefinitionHolder的创建)

     这个对另一篇章Bean Definition从加载、解析、处理、注册到BeanFactory的过程的扩展。

    Spring框架中BeanDefinition的继承结构。

    Spring框架中BeanDefinition的继承结构。在创建BeanDefinition时,可以生成RootBeanDefinition或者是GenericBeanDefinition的实例。但是现在大多数情况下都是创建GenericBeanDefinition的实例。因为。。。请看下图

    在BeanDefinition的加载、解析、处理、注册过程中的处理阶段。

    如图中红色方框的代码,现在要创建一个BeanDefinitionHolder对象。它如何创建的。情况下面的步骤。

    在DefaultBeanDefinitionDocumentReader类中

    一)、在BeanDefinitionParserDelegate类中

    二)、在BeanDefinitionParserDelegate类中

        /**
         * 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);
            String nameAttr = ele.getAttribute(NAME_ATTRIBUTE);
    
            List<String> aliases = new ArrayList<String>();
            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);
            }
            //在这里BeanDefinition 对象被创建了。
            AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);
            if (beanDefinition != null) {
                if (!StringUtils.hasText(beanName)) {
                    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);
                return new BeanDefinitionHolder(beanDefinition, beanName, aliasesArray);
            }
    
            return null;
        }

    三)、在BeanDefinitionParserDelegate类中

        /**
         * 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) {
    
            this.parseState.push(new BeanEntry(beanName));
    
            String className = null;
            if (ele.hasAttribute(CLASS_ATTRIBUTE)) {
                className = ele.getAttribute(CLASS_ATTRIBUTE).trim();
            }
    
            try {
                String parent = null;
                if (ele.hasAttribute(PARENT_ATTRIBUTE)) {
                    parent = ele.getAttribute(PARENT_ATTRIBUTE);
                }
                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;
        }

    四)、在BeanDefinitionParserDelegate类中

    五)、在BeanDefinitionReaderUtils类中

    以上就是BeanDefinition在处理阶段如何创建BeanDefinition的部分。

  • 相关阅读:
    常用修图工具的一些使用技巧及问题解决方法——ai
    IIS7web服务器调试ASP.net程序遇到的一些故障的解决办法
    使用ecstore-sdk开发包制作易开店和启明星模板
    虚拟机安装Centos6.5服务器系统
    使用UltraISO制作光盘镜像
    安装配置Windows Live Writer做为博客客户端
    Winform关于OpenFileDialog的使用方法
    SQLServer的数据类型
    SqlServer把日期转换成不同格式的字符串的函数大全
    SQL字符串处理函数大全
  • 原文地址:https://www.cnblogs.com/GooPolaris/p/8177989.html
Copyright © 2011-2022 走看看