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 Boot源码(18)-- Spring AOP源码分析三部曲,终于快讲完了 (aop:config完整解析下)