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

Posted axuduo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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>
        
    

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

以上是关于02_spring源码分析-解析及注册 BeanDefinitions的主要内容,如果未能解决你的问题,请参考以下文章

Spring源码-IOC加载过程(注解方式加载)

Spring读源码系列02----默认标签解析过程

Spring源码分析注册解析的BeanDefinition

源码系列!!spring源码深度解析

曹工说Spring Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析下)

Spring Core Container 源码分析七:注册 Bean Definitions