映射行为的弹簧自动布线



我的问题是关于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返回类型签名或集合继承层次结构中即可。在这种情况下,可以使用限定符值在相同类型的集合中进行选择,如前一段所述。

因此,您可以通过下一种方式注入Mapbean:

@Component
public class SpringMapParent {
@Resource
@Qualifier("theMap")
private Map<String, Object> theMap;
...
}

相关内容

  • 没有找到相关文章

最新更新