
在深入阅读《Spring源码深度解析》时,分析XmlBeanDefinitionReader的类图层次是一个关键环节。许多开发者在初看类图时,可能会和笔者一样,遇到一些困惑:为什么自己用IDE生成的类图,和书中展示的流程类图看起来不太一样?
书中的图2-6(见下图)为我们描绘了一个更宏观的协作视图,它不仅仅是展示继承关系,更重要的是揭示了XmlBeanDefinitionReader完成其核心任务——将XML配置文件转换为BeanDefinition——所依赖的完整组件生态。

仔细观察这张图,你会发现它与单纯的继承关系图有一个显著区别:图中出现了<<USE>>这个标记。在UML中,这表示的是一种“使用”或“依赖”关系,而非“继承”或“实现”。这意味着XmlBeanDefinitionReader类在工作时,会调用或依赖于这些标记了<<USE>>的组件。
这个发现至关重要。它引导我们跳出了“类图只展示血缘关系”的固有思维。仅仅理清XmlBeanDefinitionReader继承自AbstractBeanDefinitionReader,并实现了某些接口是远远不够的。真正的收获在于理解其设计思想:它并非一个“大而全”的类,将所有解析逻辑都塞在自己体内。
通过结合类图分析和开源实战经验,我们可以得到这样一个核心结论:

XmlBeanDefinitionReader是Spring读取XML配置的核心类,但它本身并不直接包办所有事情。它的高明之处在于采用了“继承 + 委托 + 使用”的复合模式来分解职责。
- 继承:通过继承
AbstractBeanDefinitionReader,它获得了资源加载、环境变量处理等基础能力。这体现了代码复用和层次化设计的设计模式思想。
- 委托:它将复杂的XML文档解析、元素遍历等细节工作,委托给了
DefaultBeanDefinitionDocumentReader、BeanDefinitionParserDelegate等专门的类来处理。这符合单一职责原则。
- 使用:它依赖
ResourceLoader来定位资源,使用DocumentLoader来将XML文件转换为DOM文档对象。这通过组合而非继承的方式,灵活地集成了其他组件的功能。
因此,所谓的“不干事”,恰恰是优秀Spring框架设计的体现。XmlBeanDefinitionReader扮演了一个“协调者”或“门面(Facade)”的角色,它的主要工作是组织、调度和串联起一系列专业组件,共同完成从XML到BeanDefinition的转换流水线。这种设计使得每个组件职责清晰,易于维护和扩展,也为我们学习框架源码解析提供了绝佳的范例。
理解这一点,比单纯记忆类图中的线条连接关系要深刻得多。它让我们从代码结构的层面,洞见了Spring框架内在的模块化与解耦设计哲学。在云栈社区与其他开发者交流时,探讨这类设计思想往往比讨论具体的API调用更能带来收获。
|