上一篇说完了加载xml
信息到Document
对象
源码如下,接着上篇,开始registerBeanDefinitions(Document doc,Resource resource)
来到解析Document对象标签的核心逻辑
进入 doRegisterBeanDefinitions.parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
方法
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;
//如果是默认的(import,beans,bean ...)名称空间则使用默认的解析方法解析
if (delegate.isDefaultNamespace(ele)) {
parseDefaultElement(ele, delegate);
}
// 解析自定义信息(<tx :annotation-dri ven/> ..)
else {
delegate.parseCustomElement(ele);
}
}
}
}
else {
delegate.parseCustomElement(root);
}
}
其中会对默认标签(import,bean,beans ...) 进行默认的标签解析 parseDefaultElement(ele,delegate)
以及对自定义标签的解析(<Context:annotation-config /> <tx:annotation-driver /> ..)
,最后将得到BeanDefinition
通过BeanDefinitionRegistry.registerBeanDefinition()
方法将bean定义信息注册到容器中,
其中通过BeanDefinitionParserDelegate
中的一系列方法将Xml中的属性解析到AbstractBeanDefinition
类中