java多态本身不负责切换,真正实现动态切换的是依赖注入框架(如spring)配合接口设计与路由策略;需先定义统一接口及多个实现类,再通过@qualifier、自定义注解或策略模式实现启动时静态选择或运行时动态路由。

Java 中多态本身不负责“切换”,它只保证“同一接口调用能执行不同逻辑”;真正实现多实现类动态切换的,是依赖注入框架(如 Spring)配合接口设计与显式路由策略完成的。关键在于:把选择权从硬编码移到容器管理或运行时判断中。
接口定义 + 多个实现类是前提
必须先有统一接口和至少两个实现类,这是多态能起作用的基础:
- 定义接口,比如 NotificationService,只声明
send(String content) - 提供 EmailNotification、SmsNotification、PushNotification 三个实现类
- 每个类都用
@Service注册为 Spring Bean(默认 bean 名为类名首字母小写,如emailNotification)
启动时静态选择:用 @Qualifier 或自定义注解
当容器中存在多个同一接口的 Bean,Spring 默认无法决定注入哪一个,必须明确指定:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
- 在实现类上加
@Service("email"),注入时写@Autowired @Qualifier("email") NotificationService service - 更推荐方式:定义语义化注解,如
@Email、@Sms,并在对应实现类上标注;注入时写@Autowired @Email NotificationService service - 自定义注解需加上
@Qualifier元注解,Spring 才识别其为限定符
运行时动态选择:靠策略模式封装所有实现
如果选择依据来自请求参数、用户配置或业务规则(例如根据消息类型字段 type=“sms” 决定走哪条通道),就不能只靠启动时注入:
- 新建一个 NotificationStrategy 类,用
@Autowired注入所有NotificationService实现,存入Map<string notificationservice></string> - 对外提供
sendByType(String type, String content)方法,内部按type查 map 获取实例再调用 -
type可来自 HTTP 请求参数、数据库字段或配置中心,做到不改代码即可扩展新渠道
插件化场景:按需加载实现类
对真正需要热插拔的场景(如第三方通知插件),可借助 Java 原生机制:
- 使用 ServiceLoader:在
META-INF/services/com.example.NotificationService文件中写入实现类全限定名 - 启动时调用
ServiceLoader.load(NotificationService.class)加载全部可用实现 - 或结合 YAML 配置驱动加载,例如配置
notification.channel: sms,启动时仅注册对应实现
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










