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

本文详细讲解了Spring框架中XML配置文件如何被解析成BeanDefinition的过程,包括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

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

西魏陶渊明

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

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

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

打赏作者

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

抵扣说明:

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

余额充值