珠海建设网站的公司婚纱摄影网站报价

张小明 2025/12/28 8:33:28
珠海建设网站的公司,婚纱摄影网站报价,网络营销外包公司哪家最好,建一个所在区域网站需要多少资金从废弃的XmlBeanFactory到XmlBeanDefinitionReader 统一术语 在开始之前#xff0c;我们先明确几个关键术语#xff1a; BeanFactory#xff1a;Spring 容器的基础接口#xff0c;负责 Bean 的创建、管理和获取BeanDefinition#xff1a;Bean 的定义信息#xff0c;包…从废弃的XmlBeanFactory到XmlBeanDefinitionReader统一术语在开始之前我们先明确几个关键术语BeanFactorySpring 容器的基础接口负责 Bean 的创建、管理和获取BeanDefinitionBean 的定义信息包含了 Bean 的元数据类名、属性、依赖关系等ResourceSpring 对资源的抽象可以是文件、URL、类路径资源等XmlBeanDefinitionReader专门用于读取 XML 格式的 Bean 定义问题场景当我们使用 Spring 时通常会这样加载 XML 配置BeanFactoryfactorynewXmlBeanFactory(newClassPathResource(applicationContext.xml));MyBeanbean(MyBean)factory.getBean(myBean);但你是否思考过为什么XmlBeanFactory被标记为废弃既然废弃了为什么我们还要学习它XML 配置是如何被读取和解析的从 XML 文件到BeanDefinition的过程是怎样的Spring 设计之初为什么选择了 XML 配置方式除了 XML还有哪些配置方式这些问题看似简单但深入思考会发现它们背后涉及 Spring 的核心设计思想。让我们从源码中寻找答案。源码探索第一步认识 XmlBeanFactory让我们先看看XmlBeanFactory的构造方法publicXmlBeanFactory(Resourceresource)throwsBeansException{this(resource,null);}publicXmlBeanFactory(Resourceresource,BeanFactoryparentBeanFactory)throwsBeansException{super(parentBeanFactory);this.readernewXmlBeanDefinitionReader(this);this.reader.loadBeanDefinitions(resource);}发现一XmlBeanFactory的作用是加载 XML 配置但实际上加载 XML 配置使用的是它组合的XmlBeanDefinitionReader。这里体现了组合优于继承的设计原则XmlBeanFactory并不直接处理 XML 解析而是将这部分职责委托给专门的XmlBeanDefinitionReader。类比理解这就像一家工厂XmlBeanFactory是工厂老板他不亲自去采购原材料读取 XML而是雇佣了一个专门的采购员XmlBeanDefinitionReader来负责。这样老板可以专注于管理工厂Bean 管理采购员专注于采购配置读取各司其职。类图概览在深入探索之前让我们先看看这些类之间的关系classDiagram class BeanFactory { interface getBean(name: String) Object containsBean(name: String) boolean } class DefaultListableBeanFactory { #beanDefinitionMap: Map registerBeanDefinition(name: String, bd: BeanDefinition) void getBeanDefinition(name: String) BeanDefinition } class XmlBeanFactory { -reader: XmlBeanDefinitionReader XmlBeanFactory(resource: Resource) loadBeanDefinitions(resource: Resource) void } class BeanDefinitionReader { interface loadBeanDefinitions(resource: Resource) int getRegistry() BeanDefinitionRegistry } class EnvironmentCapable { interface getEnvironment() Environment } class AbstractBeanDefinitionReader { abstract #registry: BeanDefinitionRegistry #resourceLoader: ResourceLoader loadBeanDefinitions(resource: Resource) int* loadBeanDefinitions(location: String) int } class XmlBeanDefinitionReader { loadBeanDefinitions(resource: Resource) int } class GroovyBeanDefinitionReader { loadBeanDefinitions(resource: Resource) int } class PropertiesBeanDefinitionReader { loadBeanDefinitions(resource: Resource) int } BeanFactory |.. DefaultListableBeanFactory DefaultListableBeanFactory |-- XmlBeanFactory BeanDefinitionReader |.. AbstractBeanDefinitionReader EnvironmentCapable |.. AbstractBeanDefinitionReader AbstractBeanDefinitionReader |-- XmlBeanDefinitionReader AbstractBeanDefinitionReader |-- GroovyBeanDefinitionReader AbstractBeanDefinitionReader |-- PropertiesBeanDefinitionReader XmlBeanFactory *-- XmlBeanDefinitionReader : uses note for XmlBeanFactory 已废弃 (Deprecated)br/Spring 5.1 中已标记为废弃 note for AbstractBeanDefinitionReader 使用模板方法模式br/定义通用流程具体实现由子类完成图例说明实线箭头继承关系extends虚线箭头实现关系implements实线菱形组合关系has-a斜体方法抽象方法需要子类实现第二步警惕潘多拉魔盒看XmlBeanFactory时很容易忽略它的超类。让我们看看它的继承关系XmlBeanFactory extends DefaultListableBeanFactoryDefaultListableBeanFactory是一个庞大的类包含了 Bean 注册、获取、依赖解析等大量功能。一旦深入庞大的信息量可能会劝退首次阅读源码的朋友。⚠️注意但别担心这次我们的重点并不在BeanFactory本身而是在于XML 配置是如何定义和读取的。类比理解DefaultListableBeanFactory就像一本厚厚的百科全书里面包含了所有关于 Bean 管理的知识。如果我们一开始就试图读完整本书可能会被信息量压垮。但我们可以先专注于其中一章XML 配置读取等理解了这一章再去看其他章节就容易多了。第三步聚焦核心——XmlBeanDefinitionReader既然XmlBeanFactory通过组合XmlBeanDefinitionReader来扩展能力那么我们的重点自然就落在了XmlBeanDefinitionReader做了什么第四步关注超类——吃一堑长一智有了之前忽略XmlBeanFactory超类的教训现在再看XmlBeanDefinitionReader时我们自然会关注它的超类AbstractBeanDefinitionReader。思考时刻看到这里你是否也下意识地想到这可能使用了模板方法模式让我们验证一下这个猜测。第五步探索抽象类的能力打开AbstractBeanDefinitionReader看看它实现了什么1. 实现BeanDefinitionReader接口BeanDefinitionReader定义了一组内聚的能力用于读取 Bean 定义。它提供了getRegistry()获取 Bean 定义注册表loadBeanDefinitions()多个重载方法用于加载 Bean 定义特别关注loadBeanDefinitions的重载方法可以从两个维度分类输入形式Resource对象 或location字符串数量单个 或 批量可变参数2. 实现EnvironmentCapable接口顾名思义提供获取环境信息的能力。这里的环境信息是什么暂时还不清楚我姑且先理解它类似 Linux 环境下能通过$符号获取的环境变量只不过 Spring 可能有它自己设置的方式。类比理解EnvironmentCapable就像给程序提供了一个环境变量表可以存储和获取一些配置信息。比如开发环境、测试环境、生产环境的标识或者一些系统级别的配置。这样程序就可以根据不同的环境做出不同的行为。第六步验证模板方法模式好了到这里看完了抽象类实现的接口也就了解到了抽象类所聚合的能力。那么接下来再看抽象类是否如我所料提供了模板方法。验证结果loadBeanDefinitions(Resource... resources)方法是一个典型的模板方法提供了批量读取ResourceXML 配置的能力同样loadBeanDefinitions(String... locations)也是类似的设计类比理解模板方法模式就像做菜的食谱。抽象类定义了做菜的步骤1. 准备食材 2. 烹饪 3. 装盘但具体怎么准备食材、怎么烹饪由具体的菜谱实现类来决定。这样无论是做中餐还是西餐都可以用同一套流程只是具体步骤不同。关于模板方法模式的详细讲解可以参考我的另一篇文章1.模板方法模式第七步location 到 Resource 的转换loadBeanDefinitions(String location)需要将location解析为Resource对象然后调用具体的loadBeanDefinitions(Resource resource)。解析location存在两种情况普通路径直接解析为单个Resource路径表达式由ResourcePatternResolver解析为Resource数组从ResourcePatternResolver的名字可以猜出来它可能支持路径表达式如通配符这个还需要后续进一步验证。类比理解location就像是一个地址比如北京市朝阳区而Resource就像是一个具体的房子。ResourcePatternResolver就像一个地址解析器可以把地址转换成具体的房子。如果地址是通配符比如北京市*区它还能找到所有匹配的房子。第八步最关键的问题思考时刻好了至此这个类就好结束了当然没有还差最重要的一个点如何解析 bean 定义的配置呢我们再从这个抽象类里搜索下就会发现loadBeanDefinitions(Resource resource)是一个抽象方法需要由具体类来实现。发现那么再回看XmlBeanDefinitionReader这个实现类就会不禁感叹 Spring 代码设计的精妙抽象类负责通用的流程控制模板方法具体类负责具体的解析实现XML、Groovy、Properties 等类比理解这就像是一个翻译公司。抽象类定义了翻译的流程1. 接收原文 2. 翻译 3. 输出译文但具体怎么翻译由不同的翻译员实现类决定。有的翻译员擅长翻译 XML有的擅长翻译 Groovy但他们都用同一套流程。第九步思考 Spring 为什么选择 XML思考时刻到这里我们先不展开看如何读取 XML 配置而是思考开头说的另一个问题Spring 设计之初为什么选择了 XML 的配置方式既然这里确认是个模板方法不如通过抽象类看看还有什么实现GroovyBeanDefinitionReader支持 Groovy 配置PropertiesBeanDefinitionReader支持 Properties 配置虽然有些类已被标记为废弃但也不难发现除了 XML 还有其他方式进行 Spring Bean 的定义。因为市面上用的不多我也暂时不展开阅读了。总结但这个问题值得我们思考——为什么 XML 成为了主流这可能与 XML 在 2000 年代初期的流行程度、标准化程度、工具支持等因素有关。我们将在设计思想部分进一步探讨。设计思想1. 组合优于继承XmlBeanFactory通过组合XmlBeanDefinitionReader来扩展能力而不是通过继承。这样做的好处是职责分离BeanFactory 负责 Bean 管理Reader 负责配置读取灵活扩展可以轻松替换不同的 ReaderXML、Groovy、Properties降低耦合两者可以独立演化和测试类比理解组合就像雇佣关系继承就像父子关系。组合雇佣老板可以随时换员工今天用 XML 员工明天可以换 Groovy 员工非常灵活继承父子如果用了继承就像生了个孩子想换也换不了而且孩子会继承父母的所有特性可能带来不必要的负担这就是为什么 Spring 选择组合而不是继承的原因。2. 模板方法模式AbstractBeanDefinitionReader使用模板方法模式定义了读取 Bean 定义的通用流程抽象类定义算法骨架模板方法具体类实现特定步骤如 XML 解析这种设计的好处是代码复用通用逻辑在抽象类中实现一次扩展性强新增配置格式只需实现抽象方法符合开闭原则对扩展开放对修改关闭类比理解模板方法模式就像标准化作业流程。抽象类定义了标准流程1. 打开文件 2. 解析内容 3. 注册 Bean具体类只需要实现解析内容这一步其他步骤都复用就像麦当劳的汉堡制作流程是固定的但不同口味的汉堡只需要换不同的配料关于模板方法模式的详细讲解可以参考1.模板方法模式3. 为什么选择 XMLSpring 设计之初选择 XML 的原因可能包括时代背景2000 年代初期XML 是配置文件的行业标准标准化XML 有完善的规范DTD、XSD支持验证工具支持IDE 对 XML 有良好的支持自动补全、验证可读性相比 PropertiesXML 结构更清晰支持嵌套扩展性XML 支持命名空间和自定义标签便于扩展当然随着注解和 Java 配置的兴起XML 配置逐渐被替代但理解 XML 配置的读取过程有助于理解 Spring 的整体设计。大白话总结让我们用大白话再梳理一遍1. XmlBeanFactory 是干什么的简单说就是一个工厂专门用来从 XML 文件里读取配置然后创建 Bean。类比就像一家专门生产产品的工厂工厂需要先看生产说明书XML 配置然后按照说明书来生产产品Bean。2. 为什么它被废弃了简单说因为现在有更好的方式注解、Java 配置但它的设计思想依然值得学习。类比就像以前用算盘计算现在用计算器算盘虽然不用了但算盘的原理设计思想依然有价值。3. 它是怎么工作的简单说它自己不干活而是找了个帮手XmlBeanDefinitionReader来读 XML这个帮手又有个师傅AbstractBeanDefinitionReader教它怎么读配置师傅定了规矩模板方法徒弟照着做就行类比就像老板XmlBeanFactory不亲自干活雇了个员工XmlBeanDefinitionReader员工有个师傅AbstractBeanDefinitionReader教他怎么做师傅定了标准流程员工按流程执行。4. 为什么要这样设计简单说就像工厂流水线每个环节各司其职如果以后要支持其他格式比如 JSON换个徒弟就行师傅的规矩不用变类比就像手机充电器接口是统一的抽象类的模板方法但可以换不同的充电线不同的实现类支持不同的充电协议。5. 我们学到了什么简单说看源码不要只看表面要关注它的超类和组合的类设计模式不是理论而是实际解决问题的工具好的设计会让代码更容易扩展和维护类比就像看一棵树不能只看树叶表面要看树干超类和树根组合的类这样才能理解整棵树的结构。总结本次探索收获通过这次探索我们认识了 XmlBeanFactory虽然已废弃但它的设计思想依然有价值理解了组合与继承XmlBeanFactory通过组合XmlBeanDefinitionReader扩展能力发现了模板方法模式AbstractBeanDefinitionReader使用模板方法定义通用流程思考了设计选择为什么 Spring 选择 XML这背后有时代背景和实际考量下一步我们将深入XmlBeanDefinitionReader看看它是如何将 XML 文件解析为BeanDefinition的。这将涉及 XML 解析、命名空间处理、自定义标签等更深入的内容。思考题除了 XML你还知道哪些 Spring Bean 的配置方式它们各有什么优缺点如果让你设计一个配置读取器你会如何设计为什么
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

免费flash素材网站wordpress function.in-array

一、Java冷启动问题概述 Java冷启动是指应用从启动到达到最佳性能状态的过程,包括JVM初始化、类加载、解释执行、JIT编译等多个阶段。在传统单机部署场景中,冷启动问题并不明显,但在云原生、Serverless架构下,冷启动时间直接影响…

张小明 2025/12/23 17:01:15 网站建设

购物网站开发原理制作网站需要的技术

SkyReels-V2视频生成模型技术架构与部署实践 【免费下载链接】SkyReels-V2 SkyReels-V2: Infinite-length Film Generative model 项目地址: https://gitcode.com/GitHub_Trending/sk/SkyReels-V2 SkyReels-V2作为新一代无限长度视频生成模型,在AI视频创作领…

张小明 2025/12/23 17:00:13 网站建设

怎么进行网站设计和改版中国建设网官网下载

BilibiliDown:零门槛实现B站视频本地化保存的完整方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/b…

张小明 2025/12/26 21:04:14 网站建设

哪里有做网站公司wordpress 分类文章列表分页

第一章:PHP 8.6兼容性测试概述随着 PHP 8.6 的发布临近,开发者社区对新版本的期待与关注持续升温。该版本预计将引入多项性能优化、语法增强以及底层引擎改进,因此在升级前进行全面的兼容性测试显得尤为关键。兼容性测试不仅确保现有项目能在…

张小明 2025/12/23 16:58:09 网站建设

如何知道一个网站的流量自适应网站方案

终极Logto配置指南:5个步骤实现企业级认证系统 【免费下载链接】logto logto-io/logto: 这是一个用于收集、分析和可视化日志数据的Web工具。适合用于需要收集、分析和可视化日志数据的场景。特点:易于使用,支持多种日志格式,具有…

张小明 2025/12/23 16:57:07 网站建设

移动端企业网站网页设计师中级证书

T型槽平台是一种广泛应用于机械加工、装配、检测等领域的工装设备,其结构设计独特,具有高精度、高稳定性以及灵活可调的特点。以下是关于T型槽平台的高效应用方法。合理选择材质与规格T型槽平台的材质通常包括铸铁、钢制和铝合金等。铸铁平台具有优异的减…

张小明 2025/12/23 16:56:06 网站建设