Java 映射行为的Spring自动关联

Java 映射行为的Spring自动关联,java,spring,dependency-injection,Java,Spring,Dependency Injection,我的问题是关于Spring如何通过@Autowired将java.util.Map类型的bean注入类中。具体来说,我看到的行为是,类中自动连线bean的值实际上是一个包含一个键值对的映射,其中键是bean的名称,值是我打算注入的映射。我原以为春天会直接注入地图 下面是我自动连接bean的类: @Component public class SpringMapParent { @Autowired @Qualifier("theMap") private Map<S

我的问题是关于Spring如何通过
@Autowired
java.util.Map
类型的bean注入类中。具体来说,我看到的行为是,类中自动连线bean的值实际上是一个包含一个键值对的映射,其中键是bean的名称,值是我打算注入的映射。我原以为春天会直接注入地图

下面是我自动连接bean的类:

@Component
public class SpringMapParent {
    @Autowired
    @Qualifier("theMap")
    private Map<String, Object> 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());
    }
}

为什么会这样?如何将bean中定义的映射直接注入
theMap
字段?

@Autowired
上的
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;

    ...
}
@组件
公共类SpringMapParent{
@资源
@限定词(“主题图”)
私人地图专题地图;
...
}
{theMap={}}
@Component
public class SpringMapParent {
    @Resource
    @Qualifier("theMap")
    private Map<String, Object> theMap;

    ...
}