Springframework-ioc学习(二)之BeanDefinition注册
尽管小编已经把文章分为两部分来讲了,但是还是太多了,小编把部分的解释都写到图中作为源码的注释 了(所以要注意看图)。但是还是配图太多,导致文章篇幅过长。
因为Spring接口比较多,所以原文涉及到思考的地方比较多,所以在看之前小编建议各位看官先收藏,在有时间配合Spring源码进行阅读分析。不懂的地方可以下面留言。
昨天我们第一节我们讲到xml被转换成Document对象了。今天我们要讲的是解析Document并最终转换为BeanDefinition。可能到这里还有些同学不知道BeanDefinition是干啥的。从名字上看就是Bean对象的描述信息,我们读取Bean其实就是BeanFactory读取BeanDefinition信息而生成的。小编写一段伪代码,相信就清晰了。看看BeanFactory是如何给你生成指定的Bean的。
相信到这里你已经明白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包含了每个元素(或者说叫标签)的解析器,正是这些解析器将这样的标签解析成BeanDefinition的。而NamespaceHandler是用map的方式把标签和解析器保存的
② 当根据命名空间获取了NamespaceHandler,然后进入其parse方法。我们看到了是如何获取解析器的了,就是从Map中获取。
③ 根据BeanDefinitionParser去解析Element最终生成BeanDefinition。我们看到parseInternal方法其实是一个抽象方法,是AbstractSingleBeanDefinitionParser去实现了抽象但是doParse无人实现.
我们发现到最后自定义的标签解析器,真正干活的方法是doParse没人去实现了,相信大家已经想到了,这个方法是留给开发人员使用的,这里所说的开发不是我们平时业务的开发人员,而是说像开发Dubbo的这些框架的开发人员,因为Spring允许他们很容就能把使用Spring的IOC容器来管理。集成到Spring中来使用。
到这里本节就讲完了,我们已经知道了Document对象是如何最后通过doParse给解析成BeanDefinition。我们最后看下Dubbo是如何自定义解析器的。
## Dubbo是如何自定义解析器的。
当解析到每个标签的时候,在从NamespaceHandler中拿到其对应的解析器来,解析自己定义的标签。从而来生成BeanDefinition然后交给Spring来管理的。
怎么样是不是清晰了不少,小编建议各位看官自己在源码中找找图中的所有方法,根据小编的逻辑走一步就清晰了。
最后小编送一点福利告诉你如何自定义标签解析器(小编的笔记分享给大家): http://note.youdao.com/noteshare?id=7747b43f87fb2f69860c3ad1b22846b7
文章来源: springlearn.blog.csdn.net,作者:西魏陶渊明,版权归原作者所有,如需转载,请联系作者。
原文链接:springlearn.blog.csdn.net/article/details/81448111
- 点赞
- 收藏
- 关注作者
评论(0)