Spring源码解析九

上一篇,我们知道Spring在解析xml文件之前,还需要对xml文件进行校验,校验的方式包括dtd、xsd两种方式。对xml文件的校验结束之后,我们可以通过DOM的API获取到xml的Document文档信息了。接下来我们继续分析Spring是如何解析xml文件的。回到之前的doLoadBeanDefinitions方法中:
在这里插入图片描述我们通过doLoadDocument方法已经获取到了xml对应的Document对象,接着就开始解析Document文档了。
在这里插入图片描述
1、通过createBeanDefinitionDocumentReader方法,创建BeanDefinitionDocumentReader对象,这个BeanDefinitionDocumentReader是一个接口,那么它真正的类型到底是什么呢?
在这里插入图片描述在这里插入图片描述
可以看到 这个类型就是 DefaultBeanDefinitionDocumentReader对象。

2、创建完DefaultBeanDefinitionDocumentReader之后,下一步就是通过getRegistry()方法获取我们之前传入的XmlBeanFactory容器,然后调用getBeanDefinitionCount方法获取容器已经注册bean的数量。

3、调用documentReader的registerBeanDefinitions方法开始正式解析Document文档了。
在这里插入图片描述
我们可以看到doc调用getDocumentElement获取Document的文档元素,其实就是applicationContext.xml中整个标签也就是beans标签,然后传入到doRegisterBeanDefinitions方法中。真正开始解析Document文档就是doRegisterBeanDefinitions 方法,进入到这个方法看下:
在这里插入图片描述
在这个方法中,我们首先需要看下delegate是什么,所以我们在到createdDelegate方法中看下:
在这里插入图片描述
可以看到这个delegate的类型其实就是BeanDefinitionParseDelegate,从名称可以看出来BeanDefinitionParserDeletgate是解析Document一个代理类,我们在回到doRegisterBeanfinitions方法:
在这里插入图片描述
我们主要关注这三行代码,前面的代码不用太多的关注。我们一个一个看下:
在这里插入图片描述
preProcessXml 和 postProcessXml方法都是空实现。而且这两个方法都是被protected关键词修饰了,所以我们大概可以推断出这两个方法应该是留给继承DefaultBeanDefinitionDocumentReader的子类去拓展的。
所以我们直接到parseBeanDefinitions方法中看下吧:
在这里插入图片描述
可以看到Document的解析全部都交给BeanDefinitonPareseDelegate来处理了。
1、首先delegate调用方法isDefaultNameSpace,来判断当前解析的元素root是否是默认的命名空间,是什么意思呢?我们进入isDefaultNameSpace方法看下:
在这里插入图片描述
在方法isDefaultNamespace中会继续调用isDefaultNamespace方法,在该方法中只要namespaceUri 为空或namespaceUri为:http://www.springframework.org/schema/beans。只要满足任意一个条件,就认为当前解析的标签为默认标签,否则具有其他类型的namespaceUri标签都会被认为是自定义标签。Spring自定义标签是相对于标签而言的。比如spring内部也自定义了很多标签,如tx:annotation-driven/、context:component-scan/等。
那这个namespaceUri是从哪里来的呢?我们看下我们之前的applicationContext.xml文件
在这里插入图片描述
也就是,当我们解析bean标签时,bean标签对应的命名空间的URI即namespaceURI 其实就是:http://www.springframework.org/schema/beans。同时,我们看下getNamespaceURI中看下:
在这里插入图片描述
namespaceUri的值是通过getNamespaceURI获取的,命名空间的URI其实就是从Node中获取一个属性值,而Node就是DOM API中表示具体标签的一个节点。比如每个bean标签属性信息也会封装在一个Node中。
我们在回到parseBeanDefinitions方法中:
在这里插入图片描述
因为我们xml配置就是默认的标签bean,所以我们就需要进入到parseDefaultElement方法中。由于当前spring基于注解开发用应用比较多,所以我们只重点分析spring中最核心的默认标签。
分析到这里,我们先总结一下XmlBeanFactory将资源Resource交给XmlBeanDefinitionReader 需要经历哪些重要的任务委托,我们先看下这个类的继承关系:
在这里插入图片描述
首先 XmlBeanDefinitionReader经过Resource资源各种封装之后,会将资源交给DocumentLoader来处理。DocumentLoader 将Resource资源加载成一个Document对象。接着XmlBeanDefinitionReader 又将Document解析任务交给BeanDefinitionDocumentReader来处理,BeanDefinitionDocumentReader实现类DefaultBeanDefinitionDocumentReader 又会将Document中的各种标签解析任务,全部交给BeanDefinitionParseDelegate进行处理。

总结梳理Spring源码分析的流程:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

youngerone123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值