面试题:
一个接口有多个实现类,在另外一个类中需要使用这些实现类,如何引入?
答案:
可以利用 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;
}