spring autowired vs resource

时间:2015-02-25 16:32:11

标签: java spring autowired

所以我的问题为什么@ javax.annotation.Resource工作但@AutoWired没有。对于Restful控制器的测试,我试图用@Autowired注入MappingJackson2HttpMessageConverter,启动时容器找不到合格的bean,即使该类在路径上。现在,为了解决这个问题,我进入了一个上下文xml文件并添加了bean:

<bean id="jsonConverter" class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"/>

然后在测试类中有成员变量:

@javax.annotation.Resource(name="jsonConverter")
private  MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter;

然后春天找到了豆子。 Autowire是否仅适用于通过包扫描识别为bean的bean?

提前谢谢。

3 个答案:

答案 0 :(得分:3)

AutowiredResource只会使注释字段,方法或构造函数的类类型符合依赖注入的条件 - 会自动将这些类型添加到您的上下文中春季申请!

因此,正如您所怀疑的那样,为了使注释起作用,您必须确保自己在应用程序上下文中使用自动连线类型,例如:使用Component注释和包扫描,或者像在示例中一样明确定义application-context.xml中的bean。

答案 1 :(得分:2)

在这两种情况下,Spring仅在将连接的bean定义为spring上下文时才连接依赖项。您必须在xml文件中定义bean或使用基于注释的bean定义使其符合连接条件。

另一方面,@ Resource会基于名称进行布线,而@Autowire默认采用基于类型的布线。

有关主题的更多背景信息,请参阅@Resource vs @Autowired

答案 2 :(得分:2)

这是来自Spring参考。第二段可能提供指示。

  

如果您打算按名称表达注释驱动的注入,请不要   主要使用@Autowired,即使技术上能够引用   通过@Qualifier值获取bean名称。相反,使用JSR-250   @Resource注释,在语义上定义为标识a   特定目标组件的唯一名称,具有声明的类型   与匹配过程无关。

     

作为这种语义差异的特定结果,bean就是   自己定义为集合或地图类型不能注入   通过@Autowired,因为类型匹配不适用   给他们。对于这样的bean使用@Resource,参考具体的   按唯一名称收集或映射bean。

     

@Autowired适用于字段,构造函数和多参数   方法,允许缩小通过限定符注释   参数级别。相比之下,@ Resource仅支持字段   和bean属性setter方法,只有一个参数。作为一个   结果,如果您的注射目标是a,坚持使用限定符   构造函数或多参数方法。

我认为,在您的情况下,名称默认自动装配可能存在一些问题。所以如果你提到限定符,我猜Spring可以@Autowire bean。但是,如果是@Resource的情况,我认为我更喜欢使用它。