@Autowired 和 @Resource 都是 Spring/Spring Boot 项目中,用来进行依赖注入的注解。它们都提供了将依赖对象注入到当前对象的功能,但二者却有众多不同,并且这也是常见的面试题之一,所以我们今天就来盘它。 @Autowired 和 @Resource 的区别主要体现在以下 5 点:

  1. 来源不同;
  2. 依赖查找的顺序不同;
  3. 支持的参数不同;
  4. 依赖注入的用法不同;
  5. 编译器 IDEA 的提示不同。

1.来源不同

@Autowired 和 @Resource 来自不同的“父类”,其中 @Autowired 是 Spring 定义的注解,而 @Resource 是 Java 定义的注解,它来自于 JSR-250(Java 250 规范提案)。

小知识:JSR 是 Java Specification Requests 的缩写,意思是“Java 规范提案”。任何人都可以提交 JSR 给 Java 官方,但只有最终确定的 JSR,才会以 JSR-XXX 的格式发布,如 JSR-250,而被发布的 JSR 就可以看作是 Java 语言的规范或标准。

2.依赖查找顺序不同

依赖注入的功能,是通过先在 Spring IoC 容器中查找对象,再将对象注入引入到当前类中。而查找有分为两种实现:按名称(byName)查找或按类型(byType)查找,其中 @Autowired 和 @Resource 都是既使用了名称查找又使用了类型查找,但二者进行查找的顺序却截然相反。

2.1 @Autowired 查找顺序

@Autowired 是先根据类型(byType)查找,如果存在多个 Bean 再根据名称(byName)进行查找,它的具体查找流程如下:

关于以上流程,可以通过查看 Spring 源码中的 org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor#postProcessPropertyValues 实现分析得出,源码执行流程如下图所示:

2.2 @Resource 查找顺序

@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找,它的具体流程如下图所示:

关于以上流程可以在 Spring 源码的 org.springframework.context.annotation.CommonAnnotationBeanPostProcessor#postProcessPropertyValues 中分析得出。虽然 @Resource 是 JSR-250 定义的,但是由 Spring 提供了具体实现,它的源码实现如下:

2.3 查找顺序小结

由上面的分析可以得出:

  • @Autowired 先根据类型(byType)查找,如果存在多个(Bean)再根据名称(byName)进行查找;
  • @Resource 先根据名称(byName)查找,如果(根据名称)查找不到,再根据类型(byType)进行查找。

3.支持的参数不同

@Autowired 和 @Resource 在使用时都可以设置参数,比如给 @Resource 注解设置 name 和 type 参数,实现代码如下:

@Resource(name = "userinfo", type = UserInfo.class)
private UserInfo user;
复制代码

二者支持的参数以及参数的个数完全不同,其中 @Autowired 只支持设置一个 required 的参数,而 @Resource 支持 7 个参数,支持的参数如下图所示:

4.依赖注入的支持不同

@Autowired 和 @Resource 支持依赖注入的用法不同,常见依赖注入有以下 3 种实现:

  1. 属性注入
  2. 构造方法注入
  3. Setter 注入

这 3 种实现注入的实现代码如下。

a) 属性注入

@RestController
public class UserController {// 属性注入@Autowiredprivate UserService userService;@RequestMapping("/add")public UserInfo add(String username, String password) {return userService.add(username, password);}
}
复制代码

b) 构造方法注入

@RestController
public class UserController {// 构造方法注入private UserService userService;@Autowiredpublic UserController(UserService userService) {this.userService = userService;}@RequestMapping("/add")public UserInfo add(String username, String password) {return userService.add(username, password);}
}
复制代码

c) Setter 注入

@RestController
public class UserController {// Setter 注入private UserService userService;@Autowiredpublic void setUserService(UserService userService) {this.userService = userService;}@RequestMapping("/add")public UserInfo add(String username, String password) {return userService.add(username, password);}
}
复制代码

其中, @Autowired 支持属性注入、构造方法注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入,当使用 @Resource 实现构造方法注入时就会提示以下错误:

5.编译器提示不同

当使用 IDEA 专业版在编写依赖注入的代码时,如果注入的是 Mapper 对象,那么使用 @Autowired 编译器会提示报错信息,报错内容如下图所示:

虽然 IDEA 会出现报错信息,但程序是可以正常执行的。 然后,我们再将依赖注入的注解更改为 @Resource 就不会出现报错信息了,具体实现如下:

总结

@Autowired 和 @Resource 都是用来实现依赖注入的注解(在 Spring/Spring Boot 项目中),但二者却有着 5 点不同:

  1. 来源不同:@Autowired 来自 Spring 框架,而 @Resource 来自于(Java)JSR-250;
  2. 依赖查找的顺序不同:@Autowired 先根据类型再根据名称查询,而 @Resource 先根据名称再根据类型查询;
  3. 支持的参数不同:@Autowired 只支持设置 1 个参数,而 @Resource 支持设置 7 个参数;
  4. 依赖注入的用法支持不同:@Autowired 既支持构造方法注入,又支持属性注入和 Setter 注入,而 @Resource 只支持属性注入和 Setter 注入;
  5. 编译器 IDEA 的提示不同:当注入 Mapper 对象时,使用 @Autowired 注解编译器会提示错误,而使用 @Resource 注解则不会提示错误。

@Autowired和@Resource到底有什么区别相关推荐

  1. @Autowired 和 @Resource 的 5 点区别!

    作者 | 磊哥 来源 | Java面试真题解析(ID:aimianshi666) 转载请联系授权(微信ID:GG_Stone) @Autowired 和 @Resource 都是 Spring/Spr ...

  2. @Autowired 和 @Resource 的区别(为什么更推荐使用@Resource ?)

    @Autowired 和 @Resource 的有什么区别? 相同点 不同点 @Autowired @Resource @Resource的装配顺序 要是实在不理解可以看看这个视频 !!! 为什么更推 ...

  3. @Autowired 与@Resource的区别(详细)

    原文链接: https://blog.csdn.net/weixin_40423597/article/details/80643990 spring不但支持自己定义的@Autowired注解,还支持 ...

  4. Spring中@Resource与@Autowired、@Qualifier的用法与区别

    Spring中@Resource与@Autowired.@Qualifier的用法与区别 1.@Autowired与@Resource都可以用来装配bean. 都可以写在字段上,或写在setter方法 ...

  5. Spring中@Autowired和@Resource的区别

    一.定义 @Autowired 对类成员变量.方法及构造函数进行标注,完成自动装配的工作. @Resource 在语义上被定义为通过其唯一的名称来标识特定的目标组件,其中声明的类型与匹配过程无关. 如 ...

  6. @Autowired 与@Resource的区别

    @Resource的作用相当于@Autowired,只不过@Autowired按byType自动注入,而@Resource默认按 byName自动注入罢了.@Resource有两个属性是比较重要的,分 ...

  7. Java面试--autowired和resource区别

    面试题:autowired和resource有什么区别(百度面试题) autowired和resource有什么区别 @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会 ...

  8. @Autowired和@Resource区别

    @Autowired和@Resource区别 1.提供方不同 ​ @Autowired 是Spring提供的,@Resource 是J2EE提供的. 2.装配时默认类型不同 ​ @Autowired只 ...

  9. 还在使用@Autowired 吗?@Autowired和@Resource有啥区别

    区别一 @Autowired 是 Spring 自带的注解 @Resource 是 J2EE提供,Spring 做了支持 区别二 @Autowired 默认按类型装配 @Resource 默认按照名称 ...

最新文章

  1. 吃货的自我修养,Python 告诉你哪家口味虾最好吃?
  2. Bitcoin Unlimited发布BCH新版客户端1.5.0.0,包括CTOR和CDSV
  3. zabbix监控超详细搭建过程
  4. java文件复制速度_java中文件复制得速度测试
  5. android 发布版本证书,Android Studio 获取发布版和测试版证书SHA1的两种方式
  6. VB程序设计练习题(2022年新)
  7. 松下FP-XH系列PLC 断电保持寄存器使用注意事项
  8. python里面的pip是什么意思_python中pip是什么
  9. 计算机组成原理74138译码器连接,74138(74138译码器工作原理)
  10. 深度优先搜索/广度优先搜索
  11. Google野心勃勃,微软前程堪忧!(转)
  12. SCP,NFS,TFTP的初步认识
  13. 图片批量旋转与翻转工具
  14. Kotlin-Android世界的一股清流-Package
  15. C语言向有序数组中插入一个数使该数组仍保持有序
  16. c语言中字符表,C语言指令表与符号表
  17. 智汇云舟参编《工业数字孪生白皮书(2021)》成为工业互联网联盟“工业解决方案备选提供商”
  18. android驱动例子(led灯控制),android驱动例子(LED灯控制)
  19. TMS320F28335DSP简介及最小系统设计
  20. 苹果11蓝牙配对不成功怎么办_为啥苹果11连不上蓝牙耳机

热门文章

  1. GB2312 中文简体字库表
  2. 绝对干货!Python 从业十年的程序员,写的万字经验分享
  3. 大厂频繁联手,NFT与GameFi的融合能带来哪些新叙事?
  4. 微商副业卖啥东西好?兼职微商能卖什么东西?微商怎么选品?
  5. 学习笔记-Spring Boot 开发 RESTful Web API(一)
  6. Kubernetes生态,从繁荣走向碎片化
  7. H5 画布(抄自往w3c)
  8. c语言printf和putchar区别,putchar和printf的区别是什么
  9. c51单片机秒表程序c语言,用51单片机制作一个秒表的详细过程(教程有程序)
  10. linux禁用快捷键,用CTRL+Shift+Q不能关闭Chrome浏览器,附新关闭的快捷方法