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>
        }
    }

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

猜你喜欢

转载自www.cnblogs.com/axuduo/p/11145854.html