接着上一节,我们继续讲解 parseDefaultElement
是如何实现的。
首先我们需要知道:默认标签的解析是在 parseDefaultElement
函数中进行的,函数中的功能逻辑一目了然,分别对4种不同的标签:【import】、【alias】、【bean】和【beans】做了不同的处理。
上面的图是上一节中的最后一张图,我们从这张图继续分析。
因为这四种标签中,bean 标签最难理解,所以我们首先分析 bean 标签的处理过程。
=============================================================================================
- 【步骤一】首先委托
BeanDefinitionParserDelegate
类的parseBeanDefinitionElement
方法进行元素解析,返回BeanDefinitionHolder
类型的实例bdHolder
,经过这个方法后,bdHolder
实例已经包含我们配置文件中配置的各种属性了,例如 【class
】、【name
】、【id
】、【alias
】等 - 【步骤二】当返回
bdHolder
不为空的情况下若存在默认标签的子节点下再有自定义属性,还需要再次对自定义标签进行解析 - 【步骤三】解析完成后,需要对解析后的
bdHolder
进行注册,同样,注册操作委托给了BeanDefinitionReaderUtils
的registerBeanDefinition
方法。 - 【步骤四】最后发出响应事件,通知相关的监视器,这个
bean
已经加载完了。
2.1 解析BeanDefinition
上述方法的执行过程:
- 提取元素中的
id
及name
属性 - 进一步解析其他所有属性并统封装至
GenericBeanDefinition
类型的实例中 - 如果检测到
bean
没有指定byName
, 那么使用默认规则为此Bean
生成beanName
- 将获取到的信息封装到
BeanDefinitionHolder
的实例中
【图2.1.4】中【第546行】行的作用是:创建用于承载属性的 AbstractBeanDefinition
类型的 GenericBeanDefinition
。这个步骤很重要,下面我们具体分析这个过程是如何实现的。
============================================================================================
1. 创建用于属性承载的 BeanDefinition
BeanDefinition
是一个接口,在 Spring 中存在三种实现: RootBeanDefinition
、ChildBeanDefinition
以及 GenericBeanDefinition
。三种实现均继承了 AbstractBeanDefinition
, 其