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;
}
相关推荐
卡提西亚28 分钟前
FastAPI基础入门
python·fastapi
fanruitian44 分钟前
python 机器学习 ML LinearRegression KNN KMeans
python·机器学习·kmeans
鱼宵1 小时前
取集合第一个元素,Java 为什么要写三种写法?
java·windows·python·java21
卷无止境1 小时前
给AI装上一双眼睛:快速构建代码验证器的思路与落地方案
后端·python
维克兜率天1 小时前
【维克】指数调整:哪些股票会被“强制买入“?
人工智能·python·算法
come112341 小时前
Codex 下不同场景 模式选择
python
kingx32 小时前
Windows Server 2008 应急加固实战:7 项入侵痕迹排查与修复
数据库·windows·提权·应急响应·加固
神也畏惧菠萝2 小时前
Day08 Python流程控制从入门到上瘾:if/match/while/for四件套,从B站登录一路打到猜数字游戏
python·算法·数据存储·for·while·if·ifelse
言乐62 小时前
通过 3D 动画直观演示球形瓶内可滑动半圆机构在倾倒时防粘盖、回正时刮膏体的运动学过程
python·3d·django·virtualenv·pygame
二哈赛车手2 小时前
新人笔记---hermes定时功能设计,具体讲解以及可优化点
java·人工智能·笔记·spring·ai·typescript