多态在依赖注入中需框架配合接口设计实现运行时选择具体实现;须先定义统一接口及多个实现类,再通过@qualifier、自定义注解或策略模式动态绑定。

多态在依赖注入中不是自动发生的,而是靠框架机制配合接口设计来实现“运行时选择具体实现”。关键不在于“多态本身”,而在于如何让容器知道该注入哪一个实现类。
接口定义与多个实现类是基础
必须先有统一接口和至少两个满足契约的实现类。比如:
Payment 接口声明行为;AlipayPayment 和 WechatPayment 各自实现 pay() 方法。JVM 运行时能根据对象实际类型调用对应逻辑,这是多态的底层能力,但注入环节需要显式控制。
Spring 中用 @Qualifier 指定具体实现
当 Spring 容器发现一个接口有多个 Bean 时,默认会报错。解决办法是给每个实现类打上唯一标识,并在注入点声明所需标识:
- 在实现类上用 @Service("alipay") 或 @Component("wechat") 赋予 bean 名
- 注入时写 @Autowired @Qualifier("alipay") Payment payment;
- 也可自定义注解(如 @Alipay、@Wechat),配合 @Qualifier 使用,语义更清晰
Guice 等框架用 Binding + 自定义注解绑定
类似 Spring 的 qualifier,但更底层:通过 Module 显式声明“哪个注解对应哪个实现”。
- 定义两个注解,如 @Changchun 和 @Jilin,都加上 @BindingAnnotation
- 在 Module 的 configure() 中写:binder.bind(Payment.class).annotatedWith(Changchun.class).to(AlipayPayment.class);
- 注入时写 @Inject @Changchun Payment payment;,容器就知道该选谁
运行时动态选择靠策略模式或工厂封装
如果选择逻辑不能在启动时确定(比如根据用户参数切换支付方式),就不能只靠注入一次定终身。
- 把多个实现注入进一个工厂类或策略上下文,比如 Map
存所有支付方式 - 业务方法里根据订单类型、地区等条件,从 map 中取对应的实例再调用
- 这样既保持了接口调用的统一性,又实现了运行时的灵活路由
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











