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;
}
相关推荐
青 春 记 忆2 小时前
零基础入门python30:Flask个人账本从空目录运行与阶段验收
python·flask·后端开发
l1258652 小时前
# LangGraph Memory机制深度解析:短期记忆与长期记忆的工程实践
前端·人工智能·python·langchain·bootstrap
丘山一郎3 小时前
Spring 中的IOC控制反转 和DI依赖注入
java·后端·spring
MetaLite3 小时前
Spring-AOP自调用为什么失效-AopContext真能解决吗
java·后端·spring
金銀銅鐵4 小时前
斐波那契数列的个位数出现的周期是多少?
python·数学
whcyhhh5 小时前
头歌实践教学平台:数据科学与大数据技术导论(十二)
大数据·开发语言·python·数据清洗
qq_316411035 小时前
专业的腹腔镜医疗器械物联网APP开发服务商
python
阿童木写作6 小时前
跨境电商翻译利器,批量图片视频翻译+智能抠图工具
python·音视频
JavaPub-rodert6 小时前
ChatGPT Windows 客户端突然打不开?提示找不到 Codex CLI,我这样解决了
windows·chatgpt
绘梨衣5476 小时前
异步任务队列-学习2
爬虫·python·学习·任务队列