Spring集合注入功能

面试题:

一个接口有多个实现类,在另外一个类中需要使用这些实现类,如何引入?

答案:

可以利用 Spring 的集合注入功能。Spring 会将所有实现该接口的 Bean 自动收集到一个 List 或 Map 中,然后通过 @Autowired(或构造器注入)注入到目标类中。


示例代码

示例接口:

java 复制代码
public interface MessageSender {
    void send(String to, String content);
}

示例实现类1:

java 复制代码
@Component
public class EmailMessageSender implements MessageSender {
    @Override
    public void send(String to, String content) {
        System.out.println("【邮件】发送给 " + to + ",内容:" + content);
        // 实际发送邮件的逻辑...
    }
}

示例实现类2:

java 复制代码
@Component
public class SmsMessageSender implements MessageSender {
    @Override
    public void send(String to, String content) {
        System.out.println("【短信】发送给 " + to + ",内容:" + content);
        // 实际调用短信网关的逻辑...
    }
}

示例实现类3

java 复制代码
@Component
public class WeChatMessageSender implements MessageSender {
    @Override
    public void send(String to, String content) {
        System.out.println("【微信】发送给 " + to + ",内容:" + content);
        // 实际调用微信API的逻辑...
    }
}

示例使用场景1:

需要向所有渠道发送通知时,遍历 List

java 复制代码
@Autowired
private List<MessageSender> messageSenders;

/**
 * 通过 List 方式,依次调用所有实现类发送消息
 */
@PostMapping("/send/all")
public String sendToAll(@RequestParam("to") String to, @RequestParam("content") String content) {
    for (MessageSender sender : messageSenders) {
        sender.send(to, content);
    }
    return "已通过所有渠道发送消息给 " + to;
}

示例使用场景2:

需要动态选择渠道时,从 Map 中根据渠道名获取对应的发送器

java 复制代码
@Autowired
private Map<String, MessageSender> messageSenderMap;

/**
 * 通过 Map 方式,仅调用指定的某个实现(例如:weChatMessageSender)
 * 请求参数 channel: weChatMessageSender, emailMessageSender, smsMessageSender
 */
@PostMapping("/send/channel")
public String sendByChannel(@RequestParam String channel,
                            @RequestParam String to,
                            @RequestParam String content) {
    MessageSender sender = messageSenderMap.get(channel);
    if (sender == null) {
        return "未找到渠道: " + channel;
    }
    sender.send(to, content);
    return "已通过 " + channel + " 发送消息给 " + to;
}
相关推荐
外收内放7 小时前
Python基础语法练习题(59-原始版本与优化版本)
开发语言·python
ASS-ASH7 小时前
从力学与机械原理角度深度剖析:尊界V800刹车踏板支架断裂事件的技术逻辑
人工智能·python·数据可视化·机械工程·汽车安全·物理仿真·制动系统
xhy_07077 小时前
AI 读了 .env,密钥会原样发给大模型吗?WES Code 的密钥打码(附实测)
人工智能·python·数据挖掘·flask·ai编程·wes code
2401_888859717 小时前
STM32H733 MPU、AXI、FMC学习
java·开发语言·stm32·spring
泡海椒7 小时前
JQuick-Excel 实战:用 STYLE 配置单元格与区域样式
开发语言·python·excel
威联通网络存储7 小时前
TS-h1283XU-RP 在医药批记录与检验场景的部署
网络·python
Patrick在香港7 小时前
时间戳凭空早了 8 小时:datetime.utcnow() 弃用实测与漂移复盘
数据库·python·标准库·datetime·时区·弃用
CV工程师丁Sir9 小时前
ArkWeb 手记 04|DevTools 调试与缓存清理
java·spring·缓存·harmonyos
东莞市云毅网络有限公司13 小时前
AI 引用句逐条回指原文:让回答可回溯的校验实现
python·数据清洗·rag·企业知识库·文档解析
Vex2une15 小时前
Windows 性能监视器发展史:从 PerfMon 计数器到 XPerf 深度诊断
windows·wpa·etw·性能监视器·perfmon·性能计数器·xperf