通过弹簧注入空地图

时间:2015-12-22 02:26:09

标签: java spring dependency-injection

在我的@Configuration文件中,我的bean的关系类似于以下内容:

@Bean
public Cache<Foo,Bar> fooBarCache(Map<Foo,Future<Bar>> refreshTaskMap) {
    return new AsyncUpdateCache(refreshTaskMap);
}

@Bean
public Map<Foo,Future<Bar>> refreshTaskMap() {
    return new HashMap<Foo,Future<Bar>>();
}

然而,ApplicationContext无法加载,因为它抱怨&#34;没有[com.example.Bar]&#34;类型的限定bean。据我所知,Spring正在尝试为我创建一个地图,并假设我打算使用地图查找bean或类似的东西。

如何防止它尝试进行收集注射&#34;魔法&#34;在我宣布的时候注入豆子?我已经尝试在fooBarCache参数上添加@Qualifier注释,但这似乎没有帮助。

1 个答案:

答案 0 :(得分:1)

您可以使用另一种方法来进行bean依赖注入 - 调用bean工厂方法而不是将其作为参数(Spring doc)。然后您的配置如下所示:

@Bean
public Cache<Foo,Bar> fooBarCache() {
    return new AsyncUpdateCache(refreshTaskMap()); // call the method
}

@Bean
public Map<Foo,Future<Bar>> refreshTaskMap() {
    return new HashMap<Foo,Future<Bar>>();
}

Spring很聪明地意识到你想要使用 bean refreshTaskMap而不是简单地调用方法而不是创建一个新的非托管地图实例,它将替换调用查找现有的refreshTaskMap bean。这将进一步描述here

如果您打算在其他bean(此配置类之外)中自动装配refreshTaskMap@Autowire Map<String, V>的Springs语义是自动装配V类型的所有bean的映射,其中keys是bean名称(map键类型必须为String)(reference

  

只要预期的键类型为String,即使是类型化的地图也可以自动装配。 Map值将包含所需类型的所有bean,键将包含相应的bean名称

在这种情况下,you should use @Resource

  

自身定义为集合或地图类型的bean无法通过@Autowired注入,因为类型匹配不适用于它们。将@Resource用于此类bean,以唯一名称引用特定集合或映射bean。