为什么自动装配和资源会为地图生成不同的密钥?

时间:2014-05-28 08:34:36

标签: spring

我有一个课程:

@Autowired
private Map<String, Response> violationResponseMap;

这在应用程序上下文中声明为:

<util:map id="violationResponseMap">
  <entry key="INVALID_PARAM" value-ref="X" />
</util:map>

<bean
 id="X"
 class="foo.bar.ViolationResponseFactoryBean"
 c:message="#{null}"
 c:status="404" />

在检查violationResponseMap的KeySet时,我得到:

X

但是给定与上面相同的bean声明,当我将violationResponseMap中的注释更改为:

@Resource(name = "violationResponseMap")
private Map<String, Response> violationResponseMap;

我收到了密钥INVALID_PARAM

为什么声明相同时会产生不同的结果?

2 个答案:

答案 0 :(得分:0)

@Resource将连接名为violationResponseMap的bean,而@Autowired将注入一个Map,其中包含Response类型的所有bean,其中键是豆子。请参阅http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans.html#beans-autowired-annotation

答案 1 :(得分:0)

所有这些都在the docs中解释:

  

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

  

(...)无法通过@Autowired注入自身定义为集合或映射类型的bean,因为类型匹配不适用于它们。将@Resource用于此类bean,以唯一名称引用特定集合或映射bean。