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;
}
相关推荐
荣码10 分钟前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱10 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵11 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio15 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636716 小时前
使用 Python 从零创建 Word 文档
python
Flittly16 小时前
【AgentScope Java新手村系列】(11)中断与恢复
java·spring boot·spring
Csvn21 小时前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维
dunky1 天前
Spring 的三级缓存与循环依赖
后端·spring