抽象类在java框架中承担统一契约、复用逻辑、承载状态三重职责;通过final模板方法固化流程,abstract方法交由子类实现变化点,封装通用能力并持有protected状态,配合接口实现能力组合。

抽象类在大型 Java 框架中常作为核心基础类,承担统一行为契约、复用稳定逻辑、承载共享状态三重职责。它不是简单的“模板”,而是有节制地混合抽象与实现,让子模块既受约束又保灵活。
封装通用流程骨架,用 final 模板方法固化执行顺序
框架级流程(如请求处理、状态变更、支付执行)往往步骤固定但局部逻辑各异。抽象类通过 final 方法定义不可篡改的主干流程,把变化点声明为 abstract 方法,由具体模块实现:
- 例如网关中的
AbstractAuthFilter定义final void doFilter():先解析 token → 再查白名单 → 然后调isAuthorized()→ 最后注入上下文;只有isAuthorized()是抽象的,各业务线按需校验权限 - 支付框架中
final void pay(Trade trade)保证“锁库存→调三方→更新状态→发消息”顺序不变,而callThirdParty()交由支付宝、微信等子类各自实现 - 这种设计避免流程被子类随意跳过或重排,也杜绝重复编写校验、日志、异常包装等通用逻辑
提供可继承的具体能力,减少重复代码
抽象类能直接实现子类高频共用的功能,无需每个模块从零写起:
- 网络客户端基类封装重试策略、超时配置、HTTP 日志、响应解码器,子类调
sendRequest()即可复用 - 数据访问基类持有
protected DataSource和TransactionManager,构造器注入后,所有 DAO 方法自动获得事务上下文 - 定义
public static final int DEFAULT_TIMEOUT = 5000或formatId(String raw)工具方法,整个继承体系共享统一常量和格式逻辑
承载领域状态与初始化上下文
接口无法持有实例状态,而抽象类可以定义 protected 字段、构造参数和延迟初始化资源,为子类提供运行时依赖:
-
AbstractMessageHandler在构造时接收MessageConverter和RetryTemplate,子类直接使用,不用重复构建序列化器或重试策略 -
AbstractJobExecutor初始化定时任务调度器、指标收集器、失败告警通道,子类只需关注execute()的业务逻辑 - 字段设为
protected而非private,既控制访问范围,又允许子类在必要时读取或增强状态
配合接口组合,突破单继承限制
大型框架中一个模块常需多种能力(异步、幂等、可观测),单靠继承不够灵活。抽象类专注主干流程,接口负责横向能力扩展:
-
AbstractPaymentProcessor处理核心支付生命周期,AsyncCapable接口声明asyncExecute(),Traced接口声明traceBefore() - 微信支付实现类同时
extends AbstractPaymentProcessor并implements AsyncCapable, Traced,复用骨架 + 按需叠加能力 - 上层编排层只依赖抽象类类型,运行时通过 Spring 的
@Qualifier或 SPI 加载不同实现,契约稳定,替换成本低
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











