25

我可以在我的 applicationContext 中使用 Spring (3.0.5) 执行此操作:

<bean id="map" class="java.util.HashMap" scope="prototype" >
    <constructor-arg>
        <map key-type="java.lang.String" value-type="java.lang.String">
            <entry key="Key 1" value="1" />
            <entry key="Key 2" value="2" />
        </map>
    </constructor-arg>
</bean>

在我的控制器中,我可以像这样自动连接我的地图:

@Autowired
@Qualifier("map")
private HashMap<String, String> map;

它工作正常,但如果我这样做:

@Autowired
@Qualifier("map")
private Map<String, String> map;

我明白了:

原因:org.springframework.beans.factory.NoSuchBeanDefinitionException:没有为依赖项找到类型为 [java.lang.String] 的匹配 bean [值类型为 java.lang.String 的映射]:预计至少有 1 个符合自动装配候选资格的 bean对于这种依赖。依赖注解:{@org.springframework.beans.factory.annotation.Autowired(required=true), @org.springframework.beans.factory.annotation.Qualifier(value=map)}

我的问题是:为什么我不能用接口自动连接我的地图,而我可以用实现?

谢谢。

4

2 回答 2

36

在声明一个集合类型的 bean 时,不能通过 @Autowired 注入它。请参阅 Spring 的以下文档:

4.11.3 使用限定符微调基于注释的自动装配

作为这种语义差异的特定结果,本身定义为集合或映射类型的 bean 不能通过 @Autowired 注入,因为类型匹配不适用于它们。对此类 bean 使用 @Resource,通过唯一名称引用特定的集合/映射 bean。

因此@Autowired,而不是使用@Resource

@Resource
@Qualifier("map")
private Map<String, String> map;
于 2012-12-19T09:26:08.587 回答
11

尝试使用@Resource而不是@Autowired

@Resource(name="map") 
private HashMap<String, String> map;

查看3.9.3 Fine-tuning annotation-based autowiring with qualifiers of Spring 文档中的提示

于 2012-12-19T09:21:46.660 回答