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;
}
相关推荐
凯瑟琳.奥古斯特43 分钟前
力扣1235:加权区间调度最优解
java·python·算法·leetcode·职场和发展
郑洁文1 小时前
基于Python的网络入侵检测系统
网络·python·php
AIMath~1 小时前
python中的uv命令揭秘
开发语言·python·uv
弹简特1 小时前
【零基础学Python】06-Python模块和包、异常处理、文件常用操作
开发语言·python
念恒123061 小时前
Python 面向对象编程核心:对象、实例化、封装与变量作用域
开发语言·python
薛定谔的悦1 小时前
光伏-储能-负荷联合预测:给 EMS 装上“预知能力“
java·数据库·人工智能·python·储能
在繁华处2 小时前
Java从零到熟练(十一):Spring框架入门
java·开发语言·spring
Metaphor6923 小时前
使用 Python 在 Excel 中查找并高亮显示
python·信息可视化·excel
旦莫3 小时前
AI测试Agent的两种架构路径:谁做主控?
人工智能·python·架构·自动化·ai测试
搬石头的马农3 小时前
从零配置Claude自动修Bug:6步打造全自动开发流程
java·人工智能·python·bug·ai编程