Springframework-ioc学习(二)之BeanDefinition注册

举报
西魏陶渊明 发表于 2022/09/25 01:41:04 2022/09/25
【摘要】 尽管小编已经把文章分为两部分来讲了,但是还是太多了,小编把部分的解释都写到图中作为源码的注释 了(所以要注意看图)。但是还是配图太多,导致文章篇幅过长。 因为Spring接口比较多,所以原文涉及到...

尽管小编已经把文章分为两部分来讲了,但是还是太多了,小编把部分的解释都写到图中作为源码的注释 了(所以要注意看图)。但是还是配图太多,导致文章篇幅过长。
因为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

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。