spring依托多态机制管理bean:接口定义契约,实现类提供逻辑;支持@primary默认注入、list批量注入、map按名精准调用,工厂创建对象可通过autowirebeanproperties补全依赖。

Spring 框架本身不“实现”Java多态,而是天然依托多态机制来组织和管理 Bean。接口定义行为契约,多个实现类提供具体逻辑,Spring 容器在运行时按需注入对应实例——这才是多态在 Spring 中真正落地的方式。
用接口类型注入单个实现(默认选一个)
当你声明 @Autowired private PaymentService service;,Spring 会查找所有 PaymentService 类型的 Bean。如果只有一个,直接注入;如果有多个,会报 NoUniqueBeanDefinitionException。
解决方法是标出主实现:
Java开发手册规约集合,基于阿里巴巴Java开发手册(嵩山版)。 涵盖7大维度:编程规约、异常日志、单元测试、安全规约、MySQL数据库、工程结构、设计规约。 当用户需要:(1) 编写或审查Java代码 (2) 检查命名/代码规范 (3) 处理异常和日志 (4) 编写单元测试 (5) 安全编码 (6) 数据库设...
- 在某个实现类上加
@Primary,比如@Service @Primary public class AlipayPaymentServiceImpl implements PaymentService - 这样不改调用代码,
PaymentService类型注入就默认拿到支付宝实现 -
@Primary不影响其他实现的存在,它们仍可被显式获取
用 List 注入全部实现(统一执行)
想让所有实现都参与流程,比如日志处理器、校验规则链,直接注入 List<handler></handler>:
- Spring 自动收集容器中所有
Handler接口的实现类(如EmailHandler、SmsHandler) - 注入结果是有序列表,默认按类加载顺序,可用
@Order(1)或实现Ordered接口控制优先级 - 空实现也不报错,
handlers是空List,安全遍历即可
用 Map 按名称注入多个实现(精准调用)
需要根据业务场景动态选择具体实现时,注入 Map<string paymentservice></string> 最合适:
- Key 是 Bean 名称(如
@Service("alipayService")→ key 为"alipayService") - Value 是对应实现类的实例,类型严格匹配接口
- 调用时写
paymentServiceMap.get("wechatService").pay(100),明确指定渠道 - 所有实现类必须被 Spring 扫描到(加注解 + 包路径在
@ComponentScan范围内)
工厂里创建对象也能享受多态注入
工厂模式中 new 出的对象默认脱离 Spring 管理,但可通过容器补全依赖:
- 注入
DefaultListableBeanFactory - 在工厂创建实例后,调用
beanFactory.autowireBeanProperties(instance, AutowireCapableBeanFactory.AUTOWIRE_BY_TYPE, false) - 这样
@Autowired字段(如RestTemplate、Environment)就能正常注入,无需改接口传参
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










