02_spring源码分析-解析及注册 BeanDefinitions
2020-12-13 05:39
标签:读取 targe init pre env target res getattr string 继 上篇01_spring源码分析-XmlBeanFactory https://www.cnblogs.com/axuduo/p/11144491.html 接下来看看Spring 中 Bean 的解析及注册BeanDefiniations 其中方法document对象是上篇转换过程中获取的对象;接着我们再次进入加载 及注册方法探究:registerBeanDefiniations(),或发现指向的是一个接口 BeanDefinitionsDocumentReader 的方法registerBeanDefinitions;实现类是DefaultBeanDefinitionsDocumentReader;代码如下: 磕磕绊绊的历尽千辛万苦终于要走到最底层的注册方法了;代码如下: 曙光就在前方计息剖析注册方法 至此终于完成注册解析了! 02_spring源码分析-解析及注册 BeanDefinitions 标签:读取 targe init pre env target res getattr string 原文地址:https://www.cnblogs.com/axuduo/p/11145854.html 02_spring源码分析-解析及注册 BeanDefinitions
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);
} 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 ) {
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 如:
文章标题:02_spring源码分析-解析及注册 BeanDefinitions
文章链接:http://soscw.com/essay/31453.html