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的注册。