博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
02_spring源码分析-解析及注册 BeanDefinitions
阅读量:4331 次
发布时间:2019-06-06

本文共 3365 字,大约阅读时间需要 11 分钟。

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

  继 上篇01_spring源码分析-XmlBeanFactory  

  接下来看看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 如:
} } } } else { delegate.parseCustomElement(root);        //自定义配置:
} }

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

转载于:https://www.cnblogs.com/axuduo/p/11145854.html

你可能感兴趣的文章
Two Sum leetcode java
查看>>
Val编程
查看>>
Python多线程与多线程中join()的用法
查看>>
P2915 [USACO08NOV]奶牛混合起来Mixed Up Cows
查看>>
无向图的强连通分量
查看>>
Service之来电监听(失败的案例)
查看>>
scala编程第16章学习笔记(4)——List对象的方法
查看>>
charles之抓包和断点
查看>>
在chrome中屏蔽百度推荐
查看>>
1083Moving Tables
查看>>
linux下yum安装redis以及使用
查看>>
assert()函数用法总结
查看>>
设置MySQL的字符编码
查看>>
个人冲刺09
查看>>
nodejs利用string-random生成指定的随机字符串
查看>>
UVA1025---A Spy in the Metro(DP)
查看>>
Java入门:基础算法之产生随机数
查看>>
poj3259 Wormholes【最短路-bellman-负环】
查看>>
CH5302 金字塔【区间DP】
查看>>
poj3585 Accumulation Degree【树形DP】【最大流】
查看>>