我有一个界面:
public interface EmailSender {
void send(Locale locale, List<User> recipients, int ticketId);
}
和几个不同的实现,我想自动装配它们的HashMap,有可能通过classname获得具体的实现,但是当我写的时候:
@Autowired
private HashMap<String, EmailSender> emailSenders;
我得到一个例外:
没有'java.util.HashMap'类型的限定bean
@Autowired
private List<EmailSender> emailSenders;
有趣的是,当我尝试将HashMap更改为List时,所有工作正常,你知道如何正确地做到这一点吗?
答案 0 :(得分:0)
创建一个将扩展hashMap和Autowire类的类。它会对你有用。
在列表中,您实际上是自动装配EmailSender类,而不像hashmap中的字符串。
将该类标记为组件并自动装配该组件。希望它会对你有用。 干杯
答案 1 :(得分:0)
我认为,您应该在Configuration类中声明您的bean。
@Bean
public HashMap<String, EmailSender> emailSenders(List<EmailSender> emailSenders){
HashMap<String, EmailSender> map = new HashMap<>();
emailSenders.forEach(sender -> map.put(sender.getClass().getName(), sender));
return map;
}
答案 2 :(得分:0)
如果您定义自己的bean(不可收集)类型:
使用Spring,您可以创建几个相同类型的bean。但在这种情况下你不能这样做:
@Authowire
private MyBean bean1;
@Authowire
private MyBean bean2;
但你可以做下一步:
@Authowire
@Qualifier("firstBean")
private MyBean bean1;
@Authowire
@Qualifier("firstBean")
private MyBean bean2;
同时你可以得到你bean的所有实例,要求获取它们的列表
@Authowire
private List<MyBean> beans; // all you beans will be here
如果您定义了类型为List的Map或类型的地图:
另请查看https://stackoverflow.com/a/13914052/814304 如果你使用低于4.3的Spring版本,你需要使用注释@Resource,如果你定义了类型为Map或List的bean。
答案 3 :(得分:0)
将saw303的评论重新发布为答案,这样更容易找到(我几乎错过了评论,直到第二次重读OP为止)
使用地图代替具体的HashMap – 303年12月5日在19:28看到了