所以我的问题为什么@ 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?
提前谢谢。
答案 0 :(得分:3)
Autowired
和Resource
只会使注释字段,方法或构造函数的类类型符合依赖注入的条件 - 不会自动将这些类型添加到您的上下文中春季申请!
因此,正如您所怀疑的那样,为了使注释起作用,您必须确保自己在应用程序上下文中使用自动连线类型,例如:使用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
的情况,我认为我更喜欢使用它。