相信到这里你已经明白BeanDefinition是干什么用的吧。说白了就是xml配置文件的另一种表现形式。
注意
需要注意的是Spring不仅可以使用自己的标签也允许用户自定义标签。
eg: spring默认支持的
dubbo扩展的Spring标签比如:
所以本篇文章有两个重点
①: 清楚xml转换成BeanDefinition的流程
②: 学会自定义自己的标签解析器并清楚其流程
xml转换成BeanDefinition调用流程图
我们接着昨天的地方开始讲,昨天讲了①,我们已经把XML转成了Document。今天我们沿着②的方法深入进去,看看Spring是如何把Document标签转换成Bean的(注意哦:有自定义的标签和Spring自带标签)。
我们进入registerBeanDefinitions方法
(方法看起来挺简洁,4行就完了)但是没有那么简单
解析Document和注册BeanDefinition的实现都在registerBeanDefinitions方法中
跟进registerBeanDefinitions
doRegisterBeanDefinitions
做一些检查工作,给开发者提供一点供切入的方法,比如preProcessXml解析前的处理
postProcessXml解析后的处理,可以允许子类来复写
跟进parseBeanDefinitions:
主要是解析document里面的标签
① parseDefaultElement解析Spring自带的标签
② parseCustomElement解析用户自定义的标签,比如
我们跟进parseCustomElement
根据Xml的命名空间获取处理器,并根据处理器获取处理器中用户自定义的解析器
然后我们进去Handler.parse方法,findParseForElement根据元素找到解析器
parse方法很多接口都实现了他做了什么事情呢?
①: 根据Document的命名空间获取处理器NamespaceHandler。为什么有这一步呢?因为NamespaceHandler包含了每个元素(或者说叫标签)的解析器,正是这些解析器将
② 当根据命名空间获取了NamespaceHandler,然后进入其parse方法。我们看到了是如何获取解析器的了,就是从Map中获取。
③ 根据BeanDefinitionParser去解析Element最终生成BeanDefinition。我们看到parseInternal方法其实是一个抽象方法,是AbstractSingleBeanDefinitionParser去实现了抽象但是doParse无人实现.
我们发现到最后自定义的标签解析器,真正干活的方法是doParse没人去实现了,相信大家已经想到了,这个方法是留给开发人员使用的,这里所说的开发不是我们平时业务的开发人员,而是说像开发Dubbo的这些框架的开发人员,因为Spring允许他们很容就能把使用Spring的IOC容器来管理。集成到Spring中来使用。
.到这里本节就讲完了,我们已经知道了Document对象是如何最后通过doParse给解析成BeanDefinition。我们最后看下Dubbo是如何自定义解析器的。
Dubbo是如何自定义解析器的。
当解析到每个标签的时候,在从NamespaceHandler中拿到其对应的解析器来,解析自己定义的标签。从而来生成BeanDefinition然后交给Spring来管理的。
閱讀更多 軟件編程指南 的文章