java - 可以弹出@Autowired Map吗?

标签 java spring autowired

这是 map

@Autowired
private Map<String, ISendableConverter> converters;

ISendableConverter

public interface ISendableConverter {

    ISendableMsg convert(BaseMessage baseMessage);

    String getType();
}

有一些类实现了ISendableConverter

我想通过使用 spring @Autowried 注释将它们注入(inject)到变量 converters 中。

类的实例为value,方法getType()的结果为key。

喜欢这个

@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";
    }
}

这可能吗?以及如何?

最佳答案

您可以使用 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;
}

比你注入(inject)这张 map :

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

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

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

关于java - 可以弹出@Autowired Map吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20918825/

相关文章:

java - 这是在后台线程中运行代码并通过在调用线程中执行的回调返回结果的便捷方式吗?

spring - mybatis-spring 1.2.0 中的 Autowiring

java - 如何使java枚举元素可配置

java - 如何扩展使用@ConditionalOnMissingBean注释的默认bean?

java - java中如何用两个单引号替换一个双引号

Java制作一个单独的注释,结合了其他注释

java - 从 Java 8 更新到 OpenJdk 11.0.2 时,intellij maven 中出现错误 'zip END header not found'

java - Spring Reactive 使用 ServerRequest 获取正文 JSONObject

java - Spring Autowiring 仅适用于接口(interface)

java - 干净的代码 - 应该在哪里应用 @Autowired?