自动装配@Component的HashMap

时间:2017-12-05 19:18:01

标签: java spring spring-mvc autowired

我有一个界面:

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时,所有工作正常,你知道如何正确地做到这一点吗?

4 个答案:

答案 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看到了

相关问题