
BeanDefinitionReader定义了一系列加载BeanDefinition的接口

ApplicationContext会视情况调用BeanDefinitionReader的loadBeanDefinition()方法


下面我们一起断点看一下spring如何加载配置文件
String xmlPath = "E:\\spring\\spring-framework-5.0.x\\spring-demo\\src\\main\\resources\\spring\\spring-config.xml"; ApplicationContext applicationContext = new FileSystemXmlApplicationContext(xmlPath);
运行测试代码,并将断点打在XmlBeanDefinitionReader类的loadBeanDefinitions(Resource resource)方法上

程序会执行到doLoadBeanDefinitions方法上,先将文件流解析成Document,再registerBeanDefinitions方法进行注册

再通过
documentReader.registerBeanDefinitions(doc, createReaderContext(resource));方法去注册BeanDefinition
@Override
public void registerBeanDefinitions(Document doc, XmlReaderContext readerContext) {
this.readerContext = readerContext;
logger.debug("Loading bean definitions");
Element root = doc.getDocumentElement();
//去注册BeanDefinition
doRegisterBeanDefinitions(root);
}

BeanDefinitionParserDelegate是BeanDefinition转换额委托类,spring将解析root的工作,委托给BeanDefinitionParserDelegate

进入parseDefaultElement方法

这里根据不同的标签来调用不同的类,然后进入
processBeanDefinition

BeanDefinitionHolder类是一个BeanDefinition的包装类,
BeanDefinitionParserDelegate将对应的xml节点解析成BeanDefinitionHolder,然后通过
BeanDefinitionReaderUtils.registerBeanDefinition(bdHolder, getReaderContext().getRegistry());方法注册BeanDefinition

进入registerBeanDefinition方法,此时进入DefaultListableBeanFactory类他实现了BeanDefinitionRegistry接口,BeanDefinitionRegistry接口用于BeanDefinition的注册。
Spring BeanDefinition加载机制
本文详细介绍了Spring框架中BeanDefinition的加载过程,包括如何通过BeanDefinitionReader读取配置文件、解析XML并注册BeanDefinition。
1411

被折叠的 条评论
为什么被折叠?



