【问题标题】:Spring Autowiring of Map Behavior地图行为的 Spring 自动装配
【发布时间】:2017-01-19 22:36:13
【问题描述】:

我的问题是关于 Spring 如何通过 @Autowiredjava.util.Map 类型的 bean 注入到一个类中。具体来说,我看到的行为是类中自动装配 bean 的值实际上是一个包含一个键值对的 Map,其中键是 bean 的名称,值是我的映射打算注入。我预计 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字段?

【问题讨论】:

    标签: java spring dependency-injection


    【解决方案1】:

    @Autowired on Map 正在以特定方式处理。 Documentation 说:

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

    还有另一个section 的文档说:

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

    所以,接下来你可以注入Map bean:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-09-08
      • 2015-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      相关资源
      最近更新 更多