地图行为的春天自动装配

时间:2017-01-19 22:36:14

标签: java spring dependency-injection

我的问题是关于Spring如何通过@Autowired@Component public class SpringMapParent { @Autowired @Qualifier("theMap") private Map<String, Object> theMap; ... } 类型的bean注入到类中。具体来说,我看到的行为是类中自动装配的bean实际上是一个包含一个键值对的Map,其中键是bean的名称,值是映射我打算注射。我希望Spring直接注入地图。

这是我自动装配bean的类:

theMap

我在Spring Java配置中定义了@Configuration @ComponentScan public class SpringMapConfiguration { @Bean("theMap") public Map<String, Object> getTheMap() { Map<String, Object> theMap = new HashMap<String, Object>(); return theMap; } ... } ,如下所示:

@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());
    }
}

请注意,地图大小为0.

我测试此注射的单元测试失败:

theMap

{theMap={}} 的大小实际为1.一个条目是:

theMap

这是为什么?我如何实际将bean中定义的地图直接注入x Scheme#1 Scheme#2 Scheme#3 Minfor#1 Mxfor#1 Minfor#2 Mxfor#2 Minfor#3 Mxfor#1 20 0.0351 0.04562 0.04777 0.0208 0.0385 0.0415 0.0526 0.0397 0.05601 40 0.03279 0.03946 0.034171 0.0266 0.0393 0.0323 0.04662 0.0278 0.04055 60 0.03367 0.033792 0.037776 0.0272 0.0401 0.02692 0.04066 0.029 0.04584 字段?

1 个答案:

答案 0 :(得分:2)

@Autowired上的{p> Map正在按特定方式处理。 Documentation说:

  

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

另外section文档说:

  

对于自身定义为集合/映射或数组类型的bean,@Resource是一个很好的解决方案,通过唯一名称引用特定集合或数组bean。也就是说,从4.3开始,只要元素类型信息保存在@Autowired返回类型签名或集合继承中,集合/映射和数组类型也可以通过Spring的@Bean类型匹配算法进行匹配。层次结构。在这种情况下,限定符值可用于在相同类型的集合中进行选择,如上一段所述。

所以,你可以在下一步注入Map bean:

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

    ...
}