繁体   English   中英

spring autowired vs resource

[英]spring autowired vs resource

所以我的问题为什么@ 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?

提前谢谢。

AutowiredResource只是使类类型的注释字段,方法或构造资格的依赖注入-它不会自动添加这些类型Spring应用程序的情况下!

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

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

另一方面,@ Resource确实基于名称的布线,而@Autowire默认使用基于类型的布线。

有关主题的更多上下文,请参阅@Resource vs @Autowired

这是来自Spring参考。 第二段可以提供指针。

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

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

@Autowired适用于字段,构造函数和多参数方法,允许在参数级别缩小限定符注释。 相比之下,@ Resource仅支持具有单个参数的字段和bean属性setter方法。 因此,如果您的注射目标是构造函数或多参数方法,请坚持使用限定符。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM