Spring探索|既生@Resource,何生@Autowired?
阿里妹导读
本文主要针对Spring为什么要支持@Resource和@Autowired两个类似的注解做出了解答。
@Resource和@Autowired来源 Spring官方为什么会支持这两个功能如此相似的注解? 为什么@Autowired属性注入的时候Idea会曝出黄色的警告? @Resource和@Autowired推荐用法
来源
Resource 注释标记了应用程序需要的资源。该注解可以应用于应用程序组件类,或组件类的字段或方法。当注解应用于字段或方法时,容器将在组件初始化时将所请求资源的实例注入到应用程序组件中。如果注释应用于组件类,则注释声明应用程序将在运行时查找的资源。
将构造函数、字段、设置方法或配置方法标记为由 Spring 的依赖注入工具自动装配。
However, Spring 2.5 dramatically changes the landscape. As described above, the autowiring choices have now been extended with support for the JSR-250 @Resource annotation to enable autowiring of named resources on a per-method or per-field basis. However, the @Resource annotation alone does have some limitations. Spring 2.5 therefore introduces an @Autowired annotation to further increase the level of control.
既生“@Resource”,何生“@Autowired”
类型注入
@Resource
名字注入优先,找不到名字找类型
论功能的“粒度”,@Resource已经包含@Autowired了啊,“粒度”更大啊,难道是Spring2.5的时候还不是这样?我又去翻了下Spring2.5文档,上面明确的写到:
When using @Resource without an explicitly provided name, if no Spring-managed object is found for the default name, the injection mechanism will fallback to a type-match.
Both @Autowired and @Resource work equally well. But there is a conceptual difference or a difference in the meaning.
@Resource means get me a known resource by name. The name is extracted from the name of the annotated setter or field, or it is taken from the name-Parameter. @Inject or @Autowired try to wire in a suitable other component by type. So, basically these are two quite distinct concepts. Unfortunately the Spring-Implementation of @Resource has a built-in fallback, which kicks in when resolution by-name fails. In this case, it falls back to the @Autowired-kind resolution by-type. While this fallback is convenient, IMHO it causes a lot of confusion, because people are.
@Resource 这按名称给我一个确定已知的资源。 @Autowired 尝试按类型连接合适的其他组件。
但是@Resource当按名称解析失败时会启动。在这种情况下,它会按类型解析,引起概念上的混乱,因为开发者没有意识到概念上的差异,而是倾向于使用@Resource基于类型的自动装配。
-
它们的概念不同,@Resource更倾向于找已知资源,而Autowired倾向于尝试按类型搜索资源。 方便其他框架迁移,@Resource是一种规范,只要符合JSR-250规范的其他框架,Spring就可以兼容。
既然@Resource更倾向于找已知资源,为什么也有按类型注入的功能?
个人猜测:可能是为了兼容从Spring切换到其他框架,开发者就算只使用Resource也是保持Spring强大的依赖注入功能。
Spring的区别对待
为什么@Autowired在属性上的时候Idea会曝出黄色的警告,并且推荐我们使用构造方法注入?
其实Spring文档中已经给出了答案,主要有这几点:
为什么@Resource没有呢?
在官方文档中,我没有找到答案,查了一些资料说是:@Autowired 是 Spring 提供的,一旦切换到别的 IoC 框架,就无法支持注入了. 而@Resource 是 JSR-250 提供的,它是 Java 标准,我们使用的 IoC 容器应该和它兼容,所以即使换了容器,它也能正常工作。
@Autowired和@Resource推荐用法
1. 什么场景用什么合适
2. @Autowired推荐用法
相关文章