Spring源码中关于抽象方法且是个空实现这样设计的思考

Spring源码抽象方法且空实现设计思想

在Spring源码中onRefresh()就是一个抽象方法且空实现,而refreshBeanFactory()方法就是一个抽象方法。



那么Spring源码中onRefresh方法定义了一个抽象方法且是个空实现,为什么这样设置,好处是什么。为什么不直接将onRefresh设置成抽象方法?

  1. 提供默认行为(空实现)的灵活性

    如果 onRefresh 被直接定义为抽象方法,那么所有继承 AbstractApplicationContext 的子类都必须强制实现这个方法。

    然而,在 Spring 的设计中,并不是所有的子类都需要自定义 onRefresh 的逻辑。例如,某些上下文(如 GenericApplicationContext)可能根本不需要在刷新时执行额外的操作。

    通过提供一个默认的空实现,Spring 避免了强制子类实现该方法的负担,同时允许需要扩展的子类(如 ClassPathXmlApplicationContext 或 FileSystemXmlApplicationContext)根据需要重写它。

  2. 模板方法设计模式

    onRefresh 方法是 Spring 框架中模板方法设计模式的一部分。

    在 AbstractApplicationContext 中,refresh() 方法是一个模板方法,它定义了上下文刷新过程的整体流程,而 onRefresh() 是其中的一个可扩展的钩子方法。

    通过将 onRefresh 定义为空实现,Spring 允许子类在 refresh() 的特定阶段插入自定义逻辑,而无需修改父类的代码。

  3. 避免强制实现,提高代码复用性

    如果 onRefresh 被定义为抽象方法,那么所有继承 AbstractApplicationContext 的子类都必须实现它,即使它们不需要任何额外的逻辑。

    这会导致代码冗余,因为子类可能只是简单地返回或调用父类的其他方法,而不需要实际的实现。

    通过提供空实现,Spring 提高了代码的复用性,并减少了不必要的实现。

  4. 清晰的设计意图

    空实现明确地传达了设计意图:onRefresh 是一个可选的扩展点,子类可以选择性地重写它。

    如果 onRefresh 是抽象方法,开发者可能会误以为它是一个必须实现的核心方法,从而导致误解或不必要的实现。

  5. onRefresh 是一个可选的扩展点,允许子类在上下文刷新过程中插入自定义逻辑。它不是上下文刷新的核心步骤,因此可以提供一个空实现。

    refreshBeanFactory 是上下文刷新的核心步骤之一,负责创建和初始化 BeanFactory。不同的上下文实现需要不同的逻辑来完成这一步骤,因此必须由子类提供具体实现。

相关推荐
Dovis(誓平步青云)6 分钟前
《Linux CPU频率为何忽高忽低:cpufreq、idle状态与性能抖动教程》
linux·运维·服务器·spring boot·后端·生成对抗网络
Lhappy嘻嘻7 小时前
Java IO|File 文件操作 + 字节流 / 字符流完整笔记 + 递归删除文件实战
java·笔记·php
To_OC7 小时前
手写 AI 编程 Agent 的命令执行工具:我被 child_process 坑出来的实战经验
后端·node.js·agent
伊玛目的门徒8 小时前
试用leetcode之典中典 二数之和问题
java·算法·leetcode
逝水无殇10 小时前
C# 异常处理详解
开发语言·后端·c#
懒鸟一枚10 小时前
深入理解 Linux 内存、Swap 交换分区与分页机制的关系
java·linux·数据库
我命由我1234512 小时前
执行 Gradle 指令报错,无法将“grep”项识别为 cmdlet、函数、脚本文件或可运行程序的名称
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
考虑考虑12 小时前
Sentinel安装
java·后端·微服务
IT_陈寒12 小时前
SpringBoot自动配置失灵?你可能忘了这个关键注解
前端·人工智能·后端
碎碎念_49212 小时前
SpringBoot + Vue 前后端分离从 0 到 1 完整环境配置流程
vue.js·spring boot·后端