zoukankan      html  css  js  c++  java
  • 02_spring源码分析-解析及注册 BeanDefinitions

      02_spring源码分析-解析及注册 BeanDefinitions

      继 上篇01_spring源码分析-XmlBeanFactory https://www.cnblogs.com/axuduo/p/11144491.html 

      接下来看看Spring 中 Bean 的解析及注册BeanDefiniations

      1、首先看看源码:

      

      //注册方法
       public
    int registerBeanDefinitions(Document doc, Resource resource) throws BeanDefinitionStoreException { BeanDefinitionDocumentReader documentReader = createBeanDefinitionDocumentReader();
         //记录统计之前BeanDefinition的加载个数
    int countBefore = getRegistry().getBeanDefinitionCount();
         //加载及注册 documentReader.registerBeanDefinitions(doc, createReaderContext(resource));
         //记录本次加载的Definition个数
    return getRegistry().getBeanDefinitionCount() - countBefore; } /** * 实例化一个BeanDefinitionDocumentReader对象*/ protected BeanDefinitionDocumentReader createBeanDefinitionDocumentReader() { return BeanUtils.instantiateClass(this.documentReaderClass); }

      其中方法document对象是上篇转换过程中获取的对象;接着我们再次进入加载 及注册方法探究:registerBeanDefiniations(),或发现指向的是一个接口 BeanDefinitionsDocumentReader 的方法registerBeanDefinitions;实现类是DefaultBeanDefinitionsDocumentReader;代码如下:

      public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
            this.readerContext = readerContext;             //读取上下文
            doRegisterBeanDefinitions(doc.getDocumentElement());  //执行注册
        }

      磕磕绊绊的历尽千辛万苦终于要走到最底层的注册方法了;代码如下:

       protected void doRegisterBeanDefinitions(Element root) {
            //专门处理解析
            BeanDefinitionParserDelegate parent = this.delegate;
            this.delegate = createDelegate(getReaderContext(), root, parent);
         //处理profile属性 
            if (this.delegate.isDefaultNamespace(root)) {
                String profileSpec = root.getAttribute(PROFILE_ATTRIBUTE);
                if (StringUtils.hasText(profileSpec)) {
                    String[] specifiedProfiles = StringUtils.tokenizeToStringArray(
                            profileSpec, BeanDefinitionParserDelegate.MULTI_VALUE_ATTRIBUTE_DELIMITERS);
                    if (!getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
                        if (logger.isDebugEnabled()) {
                            logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec +
                                    "] not matching: " + getReaderContext().getResource());
                        }
                        return;
                    }
                }
            }
        
        //解析前处理      
        preProcessXml(root);
        解析注册  
        parseBeanDefinitions(root, this.delegate);
        //解析后处理
        postProcessXml(root);
        this.delegate = parent;
      }

      曙光就在前方计息剖析注册方法

      

      protected void parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate) {
            if (delegate.isDefaultNamespace(root)) {
                NodeList nl = root.getChildNodes();
                for (int i = 0; i < nl.getLength(); i++) {
                    Node node = nl.item(i);
                    if (node instanceof Element) {
                        Element ele = (Element) node;
                        if (delegate.isDefaultNamespace(ele)) {
                            parseDefaultElement(ele, delegate);
                        }
                        else {
                            delegate.parseCustomElement(ele);  //处理默认配置bean 如:<bean id="test" class="testperson">
                        }
                    }
                }
            }
            else {
                delegate.parseCustomElement(root);        //自定义配置:<tx:annotation-driven>
            }
        }

      至此终于完成注册解析了!

  • 相关阅读:
    Mybatis动态SQL
    Mybatis05__#和$的区别
    Mybatis04__输入参数/输出参数
    数据库中的字段和实体类中的字段不一致
    Mybatis中常用注解
    Mybatis03__配置文件简介
    Mybatis实现增、删、改操作时返回主键
    Mybatis04__CURD
    Mybatis02__Mybatis搭建
    lxrunoffline的使用
  • 原文地址:https://www.cnblogs.com/axuduo/p/11145854.html
Copyright © 2011-2022 走看看