我的问题是关于Spring如何通过@Autowired
将类型为java.util.Map
的bean注入到类中。具体来说,我看到的行为是,类中自动连接的bean的值实际上是一个Map,它包含一个键值对,其中key是bean的名称,value是我想要注入的Map。我原以为Spring会直接注入映射。
这是我自动连接bean的类:
@Component
public class SpringMapParent {
@Autowired
@Qualifier("theMap")
private Map<String, Object> theMap;
...
}
我在Spring Java配置中定义了theMap
,如下所示:
@Configuration
@ComponentScan
public class SpringMapConfiguration {
@Bean("theMap")
public Map<String, Object> getTheMap() {
Map<String, Object> theMap = new HashMap<String, Object>();
return theMap;
}
...
}
请注意,贴图大小为0。
我测试此注入的单元测试失败:
@ContextConfiguration(classes = {SpringMapConfiguration.class})
@RunWith(SpringJUnit4ClassRunner.class)
public class SpringMapIT {
@Autowired
private SpringMapParent springMapParent;
@Test
public void testSpringMapParentAutowiredCorrectly() {
Map<String, Object> theMap = springMapParent.getTheMap();
assertEquals(0, theMap.size());
}
}
theMap
的大小实际上是1。一个条目是:
{theMap={}}
为什么会这样?如何将bean中定义的映射直接注入theMap
字段?
Map
上的@Autowired
以特定方式进行处理。文件显示:
即使类型映射也可以自动连接,只要期望的键类型是String。Map值将包含预期类型的所有bean,键将包含相应的bean名称
文档的另一部分还说:
对于本身定义为集合/映射或数组类型的bean,
@Resource
是一个很好的解决方案,通过唯一的名称引用特定的集合或数组bean。也就是说,从4.3开始,集合/映射和数组类型也可以通过Spring的@Autowired
类型匹配算法进行匹配,只要元素类型信息保留在@Bean
返回类型签名或集合继承层次结构中即可。在这种情况下,可以使用限定符值在相同类型的集合中进行选择,如前一段所述。
因此,您可以通过下一种方式注入Map
bean:
@Component
public class SpringMapParent {
@Resource
@Qualifier("theMap")
private Map<String, Object> theMap;
...
}