BeanDefinitionReader 如何從resource把BeanDefinition註冊到工廠
BeanDefinitionReader
AbstractBeanDefinitionReader
XmlBeanDefinitionReader
1 、BeanDefinitionReader#loadBeanDefinitions(Resource resource)
從指定資源加載BeanDefinition
2、XmlBeanDefinitionReader中實現
最終調到doLoadBeanDefinitions(InputSource inputSource, Resource resource)
得到document,xml結構
Document doc = this.documentLoader.loadDocument(
inputSource, getEntityResolver(), this.errorHandler, validationMode, isNamespaceAware());
registerBeanDefinitions(doc, resource);
調用BeanDefinitionDocumentReader#registerBeanDefinitions(doc, createReaderContext(resource))
3、public class DefaultBeanDefinitionDocumentReader implements BeanDefinitionDocumentReader
調用到方法
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);
}
}
}
}
else {
delegate.parseCustomElement(root);
}
}
private void parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) {
if (delegate.nodeNameEquals(ele, IMPORT_ELEMENT)) {
importBeanDefinitionResource(ele);
}
else if (delegate.nodeNameEquals(ele, ALIAS_ELEMENT)) {
processAliasRegistration(ele);
}
else if (delegate.nodeNameEquals(ele, BEAN_ELEMENT)) {
processBeanDefinition(ele, delegate);
}
else if (delegate.nodeNameEquals(ele, NESTED_BEANS_ELEMENT)) {
// recurse
doRegisterBeanDefinitions(ele);
}
}
processBeanDefinition(ele, delegate);
BeanDefinitionHolder bdHolder = delegate.parseBeanDefinitionElement(ele);
//BeanDefinitionParserDelegate這個工具類從xml配置信息得到BeanDefinition
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());
//getReaderContext().getRegistry()即爲DefaultListableBeanFactory,方法內即是使用registerBeanDefinition(String beanName, BeanDefinition beanDefinition)
把BeanDefinition註冊到工廠