我的问题是关于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
字段?
答案 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;
...
}