java多态是spring、mybatis、junit等框架的底层骨架,支撑策略抽象、模板方法、集合泛型隐式多态及动态代理,实现解耦、扩展与统一接口。

Java 多态在框架设计中不是“可选技巧”,而是底层骨架——Spring、MyBatis、JUnit 等主流框架大量依赖多态来解耦、扩展和统一接口。
策略抽象:用接口定义行为契约
框架不关心具体怎么干,只约定“必须能干什么”。比如 Spring 的 BeanPostProcessor 接口,定义了 postProcessBeforeInitialization 和 postProcessAfterInitialization 两个方法。开发者可自由实现多个子类(如日志增强、权限校验、缓存预热),Spring 容器在初始化 Bean 时统一调用,无需修改框架源码。
- 所有实现类都遵循同一接口,框架只需面向接口编程
- 新增策略只需新增实现类 + 注册,零侵入原有逻辑
- 运行时根据实际类型动态调用,天然支持插件化
模板方法:父类定流程,子类填细节
很多框架核心类采用 abstract class + 模板方法模式。例如 MyBatis 的 BaseExecutor 定义了 query 主干流程(查缓存 → 调用 doQuery → 结果封装),但把 doQuery 声明为 abstract,由 SimpleExecutor、CachingExecutor 等子类各自实现。
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 框架控制执行节奏和公共逻辑(事务、日志、异常包装)
- 子类专注差异化部分(SQL 执行方式、是否走二级缓存)
- 上层代码只操作 BaseExecutor 引用,完全屏蔽实现差异
集合与泛型中的隐式多态
框架大量使用接口类型作为参数或返回值,让调用方自由选择具体实现。例如:
- Spring 的
TransactionDefinition是接口,用户传DefaultTransactionDefinition或自定义实现,框架统一处理 - MyBatis 的
SqlSession接口,背后可能是DefaultSqlSession或代理增强的SqlSessionManager - JUnit5 的
ExtensionContext接口,不同测试场景下由不同子类提供上下文数据
动态代理与运行时多态结合
Spring AOP 的核心就是基于多态的动态代理。它为目标对象创建代理(如 ProxyFactory.getProxy()),该代理实现了目标类的所有接口。当调用方法时,代理先执行切面逻辑(@Before/@Around),再通过反射调用真实对象的方法——而这个“真实对象”本身也可能是另一个代理,形成链式多态调用。
- 业务代码仍面向原始接口调用,无感知代理存在
- 切面逻辑与业务逻辑彻底分离,靠多态+反射桥接
- 同一个接口引用,在不同阶段指向不同实际对象(原始 bean / 增强 proxy / 缓存 wrapper)
多态让框架既保持稳定接口,又具备无限延展能力。它不是写出来的功能,而是架构呼吸的方式。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










