可以使用 spring @Autowired Map 吗?

新手上路,请多包涵

这是地图

@Autowired
private Map<String, ISendableConverter> converters;

ISendableConverter

 public interface ISendableConverter {

    ISendableMsg convert(BaseMessage baseMessage);

    String getType();
}

有一些类实现了 ISendableConverter

我想通过使用 spring @Autowried 注释将它们注入变量 converters

类的实例作为值,方法的结果 getType() 作为键。

像这个

@Component
public class SendableVoiceMsgConverter implements ISendableConverter {

    @Override
    public ISendableMsg convert(BaseMessage baseMessage) {
        // TODO Auto-generated method stub
        return null;
    }

    @Override
    public String getType() {
        return "VOICE";
    }
}

这可能吗?如何?

原文由 Joe 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 701
1 个回答

您可以使用 Spring Java 配置使用您选择的键创建一个自动初始化的映射:

在用 @Configuration 注释注释的类中:

 @Autowired
private List<ISendableConverter> sendableConverters;

@Bean
public Map<String, ISendableConverter> sendableConvertersMap() {
    Map<String, ISendableConverter> sendableConvertersMap = new HashMap<>();
    for (ISendableConverter converter : sendableConverters) {
        sendableConvertersMap.put(converter.getType(), converter);
    }
    return sendableConvertersMap;
}

比你注入这张地图:

 @Resource()
private Map<String, ISendableConverter> sendableConverters;

如果您定义了更多相同类型的地图,您可以选择将一些选择器字符串添加到您的 @Resource 注释中。

这样你所要做的就是通过你的spring bean实现 ISendableConverter ,它会自动出现在上面定义的Map中。您不需要为每个实现手动创建地图项。

原文由 Ondrej Bozek 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题