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。不同的上下文实现需要不同的逻辑来完成这一步骤,因此必须由子类提供具体实现。

相关推荐
带刺的坐椅5 分钟前
能用 Java8 开发 MCP(或 MCP Server),这才是 MCP 自由(Solon AI MCP)!
java·spring·ai·solon·mcp·mcp-server
Eugene__Chen10 分钟前
内存管理详解(曼波脑图超详细版!)
java·jvm·windows
洛神灬殇14 分钟前
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
数据库·redis·后端
Java知识库31 分钟前
Java基础知识面试题(已整理Java面试宝典pdf版)
java·面试·程序员·编程·面试题
雷渊1 小时前
DDD经典的四层架构和洋葱架构、六边形架构区别
后端
SimonKing1 小时前
【Spring Boot配置终极指南】1分钟让你精准指定配置文件,使应用部署游刃有余!
java·后端
雷渊1 小时前
深入分析理解洋葱架构
后端
axinawang1 小时前
SpringBoot整合Java Web三大件
java·前端·spring boot
Java个体户1 小时前
struts2和springmvc混合项目,上传文件报错
spring
程序媛学姐1 小时前
SpringBoot Actuator健康检查:自定义HealthIndicator
java·spring boot·后端