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> } }
至此终于完成注册解析了!