processBeanDefinition() 负责 Bean 标签的解析
- 在解析过程中首先调用 BeanDefinitionParserDelegate.parseBeanDefinitionElement() 完成默认标签的解析
- 如果解析成功(返回的 bdHolder != null ),则首先调用 BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired() 完成自定义标签元素解析
public BeanDefinitionHolder decorateBeanDefinitionIfRequired(Element ele, BeanDefinitionHolder definitionHolder) {
return decorateBeanDefinitionIfRequired(ele, definitionHolder, null);
}
调用 decorateBeanDefinitionIfRequired()
:
- 遍历节点(子节点),调用
decorateIfRequired()
装饰节点(子节点)- 首先获取自定义标签的命名空间,如果不是默认的命名空间则根据该命名空间获取相应的处理器
- 最后调用处理器的
decorate()
进行装饰处理
Bean 的解析过程已经全部完成了,下面做一个简要的总结:
- 解析 BeanDefinition 的入口在
DefaultBeanDefinitionDocumentReader.parseBeanDefinitions()
- 该方法会根据命令空间来判断标签是默认标签还是自定义标签
- 其中默认标签由
parseDefaultElement()
实现 - 自定义标签由
parseCustomElement()
实现
- 其中默认标签由
- 在默认标签解析中,会根据标签名称的不同进行 import 、alias 、bean 、beans 四大标签进行处理,其中 bean 标签的解析为核心,它由
processBeanDefinition()
方法实现processBeanDefinition()
开始进入解析核心工作,分为三步:- 解析默认标签:BeanDefinitionParserDelegate.parseBeanDefinitionElement()
- 解析默认标签下的自定义标签:BeanDefinitionParserDelegate.decorateBeanDefinitionIfRequired()
- 注册解析的 BeanDefinition:BeanDefinitionReaderUtils.registerBeanDefinition
- 核心工作由
parseBeanDefinitionElement()
方法实现,该方法会依次解析 Bean 标签的属性、各个子元素,解析完成后返回一个 GenericBeanDefinition 实例对象
- 该方法会根据命令空间来判断标签是默认标签还是自定义标签