Springframework学习(二)之BeanDefinition注册

Springframework学习(二)之BeanDefinition注册

Springframework学习(二)之BeanDefinition注册

相信到这里你已经明白BeanDefinition是干什么用的吧。说白了就是xml配置文件的另一种表现形式。

注意

需要注意的是Spring不仅可以使用自己的标签也允许用户自定义标签。

eg: spring默认支持的,,

Springframework学习(二)之BeanDefinition注册

dubbo扩展的Spring标签比如:

Springframework学习(二)之BeanDefinition注册

所以本篇文章有两个重点

①: 清楚xml转换成BeanDefinition的流程

②: 学会自定义自己的标签解析器并清楚其流程

xml转换成BeanDefinition调用流程图

Springframework学习(二)之BeanDefinition注册

我们接着昨天的地方开始讲,昨天讲了①,我们已经把XML转成了Document。今天我们沿着②的方法深入进去,看看Spring是如何把Document标签转换成Bean的(注意哦:有自定义的标签和Spring自带标签)。

Springframework学习(二)之BeanDefinition注册

我们进入registerBeanDefinitions方法

Springframework学习(二)之BeanDefinition注册

(方法看起来挺简洁,4行就完了)但是没有那么简单

解析Document和注册BeanDefinition的实现都在registerBeanDefinitions方法中

跟进registerBeanDefinitions

Springframework学习(二)之BeanDefinition注册

doRegisterBeanDefinitions

做一些检查工作,给开发者提供一点供切入的方法,比如preProcessXml解析前的处理

postProcessXml解析后的处理,可以允许子类来复写

Springframework学习(二)之BeanDefinition注册

跟进parseBeanDefinitions:

主要是解析document里面的标签

① parseDefaultElement解析Spring自带的标签

② parseCustomElement解析用户自定义的标签,比如

Springframework学习(二)之BeanDefinition注册

我们跟进parseCustomElement

根据Xml的命名空间获取处理器,并根据处理器获取处理器中用户自定义的解析器

Springframework学习(二)之BeanDefinition注册

然后我们进去Handler.parse方法,findParseForElement根据元素找到解析器

Springframework学习(二)之BeanDefinition注册

parse方法很多接口都实现了他做了什么事情呢?

①: 根据Document的命名空间获取处理器NamespaceHandler。为什么有这一步呢?因为NamespaceHandler包含了每个元素(或者说叫标签)的解析器,正是这些解析器将这样的标签解析成BeanDefinition的。而NamespaceHandler是用map的方式把标签和解析器保存的

Springframework学习(二)之BeanDefinition注册

② 当根据命名空间获取了NamespaceHandler,然后进入其parse方法。我们看到了是如何获取解析器的了,就是从Map中获取。

Springframework学习(二)之BeanDefinition注册

③ 根据BeanDefinitionParser去解析Element最终生成BeanDefinition。我们看到parseInternal方法其实是一个抽象方法,是AbstractSingleBeanDefinitionParser去实现了抽象但是doParse无人实现.

Springframework学习(二)之BeanDefinition注册

Springframework学习(二)之BeanDefinition注册

我们发现到最后自定义的标签解析器,真正干活的方法是doParse没人去实现了,相信大家已经想到了,这个方法是留给开发人员使用的,这里所说的开发不是我们平时业务的开发人员,而是说像开发Dubbo的这些框架的开发人员,因为Spring允许他们很容就能把使用Spring的IOC容器来管理。集成到Spring中来使用。


.到这里本节就讲完了,我们已经知道了Document对象是如何最后通过doParse给解析成BeanDefinition。我们最后看下Dubbo是如何自定义解析器的。

Dubbo是如何自定义解析器的。

Springframework学习(二)之BeanDefinition注册

当解析到每个标签的时候,在从NamespaceHandler中拿到其对应的解析器来,解析自己定义的标签。从而来生成BeanDefinition然后交给Spring来管理的。

Springframework学习(二)之BeanDefinition注册

Springframework学习(二)之BeanDefinition注册


分享到:


相關文章: