首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >面试突击78:@Autowired 和 @Resource 有什么区别?

面试突击78:@Autowired 和 @Resource 有什么区别?

作者头像
磊哥
发布于 2022-09-27 10:07:52
发布于 2022-09-27 10:07:52
13.4K09
代码可运行
举报
文章被收录于专栏:王磊的博客王磊的博客
运行总次数:9
代码可运行

@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 参数,实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Resource(name = "userinfo", type = UserInfo.class)
private UserInfo user;

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

4.依赖注入的支持不同

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

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

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

a) 属性注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class UserController {
    // 属性注入
    @Autowired
    private UserService userService;

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

b) 构造方法注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class UserController {
    // 构造方法注入
    private UserService userService;

    @Autowired
    public UserController(UserService userService) {
        this.userService = userService;
    }

    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

c) Setter 注入

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@RestController
public class UserController {
    // Setter 注入
    private UserService userService;

    @Autowired
    public 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 注解则不会提示错误。
参考 & 鸣谢
  • www.cnblogs.com/felordcn/p/13063802.html
  • blog.csdn.net/CPLASF_/article/details/109225213

是非审之于己,毁誉听之于人,得失安之于数。 面试合集:https://gitee.com/mydb/interview

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-08-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【javaScript案例】之支付10秒倒计时
这个案例其实很简单,只要掌握了js基础中的onclick函数以及定时器的使用,就能快速的做出这样的效果,让我们一起来看看怎么做吧~
xinxin-l
2022/03/29
1.3K0
【javaScript案例】之支付10秒倒计时
JavaScript案例:倒计时
案例分析 核心算法:输入的时间减去现在的时间就是剩余时间,即倒计时,但是不能拿时分秒去减,比如05分减去25分,结果是负数。 用时间戳来实现,用户输入时间总的毫秒数减去现在时间的总的毫秒数,得到的就是剩余时间的毫秒数。 把剩余时间的毫秒数转换为时分秒标准格式。 转换公式 d = parselnt(总秒数/60/60/24);//计算天数 h = parselnt(总秒数/60/60%24); //计算小时 m = parselnt(总秒数/60%60); //计算分数 s = parselnt(总秒数%60
岳泽以
2022/10/26
1.9K0
BOM概述
在上一篇文章中我们学习了DOM,接下来让我们先通过和DOM的对比来简单了解一下BOM
秋落雨微凉
2022/10/25
1.4K0
BOM概述
js定时跳转网页_js 网页代码
window.οnlοad=init; function init(){ window.setTimeout(“tiaozhuan()”,5000); window.setInterval(“shijian()”,1000); //五秒后调用tiaozhuan } function tiaozhuan(){ location.replace(“http://www.baidu.com”); }
全栈程序员站长
2022/09/21
46.3K1
js定时跳转网页_js 网页代码
wordpress 设置go跳转页面
摘要:自从用了DUX5.2后,文章内的跳转链接变成了go跳转,但之前并不了解这个东西,所以之前文章内的链接打开直接跳404;,使用go跳转后, 先访问本地的 Go 页面( go 文件夹下的 index.php )然后再跳转到相应的外链网站。
AlexTao
2019/12/13
3.6K0
wordpress 设置go跳转页面
JavaScript——location对象
window对象给我们提供了一个location属性用于获取或设置窗体的URL,并且可以用于解析URL,因为这个属性返回的是一个对象,所以我们将这个属性也称为location对象。
岳泽以
2022/10/26
5860
WordPress纯代码外链跳转效果的3款样式免费分享
前面给大家讲了WordPress怎么利用纯代码实现WordPress的外链跳转效果,今天给大家分享几款跳转样式。
于飞云计算
2019/06/26
1.7K0
WordPress纯代码外链跳转效果的3款样式免费分享
web前端入门
8 = html + css +javascript(jQuery和vue就是js封装的函数而已)
小闫同学啊
2019/07/18
1.3K0
IE条件注释,嗅探低版本IE用户,并引导升级
语句的意思是:IE8浏览器下,引入my.css文件。其他版本IE浏览器,if判断为flase,则不引入。
我是leon
2019/08/28
9470
webApis05-swiper插件、window对象、定时器、location
节点 查找父节点 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>薪资想过万,代码敲三遍</title> </head> <bod
yuanshuai
2022/08/17
4380
用settimeout如何实现倒计时_javascript一分钟倒计时代码
注:setTimeout执行完可以不用执行clearTimeout,这个clearTimeout效果类似于微信撤回功能,假如setTimeout设置2分钟后自动跳转www.baidu.com,但用户在2分钟内突然不想让页面跳去baidu,执行clearTimeout就能取消这个定时操作了,但是如果2分钟都过了,显然定时器已经失效了。但是如果不执行clearInterval,setInterval就不会停止
全栈程序员站长
2022/11/09
1.5K0
JAVA保姆式上手教程之免费JAVA 案例day02-js高级
bom: browser object model 浏览器对象模型 js希望和浏览器有一定的交互能力
张哥编程
2024/12/13
1610
通过session实现用户的登录与登出功能
本文讲解,就是在常见的登录注册页面中,我们是如何在登录之后,把用户的信息传送到后面的网页。
GeekLiHua
2025/01/21
1860
通过session实现用户的登录与登出功能
HTML
浏览器(browser application)是用来访问和浏览万维网页面的客户端软件,是显示、运行网页的平台。
用户9615083
2022/12/25
4.1K0
HTML
谷粒商城—分布式基础(Vue篇)
v-xx:指令 1、创建vue实例,关联页面的模板,将自己的数据(data)渲染到关联的模板,响应式的 2、指令来简化对dom的一些操作。 3、声明方法来做更复杂的操作。methods里面可以封装方法。
OY
2022/03/20
1.1K0
谷粒商城—分布式基础(Vue篇)
JS案例——下班倒计时
设置一个定时器,每隔一秒刷新一次 定时器函数中显示剩余秒数转化为的时间 1. 设置两个时间戳,一个是当前的,另一个是目标时间的 2. 求出距离下班还有多少秒 3. 获取时,分,秒。并将剩余秒数转化为的时间添加到页面中 4. 修改细节
且陶陶
2023/04/12
6.3K0
JS案例——下班倒计时
第36天:倒计时:发动短信验证、跳转页面、关闭广告
setTimeout("函数",时间) setInterval(fn,5000);//每隔5秒执行一次fn setTimeout(fn,5000);//5秒之后执行一次fn
半指温柔乐
2018/09/11
7050
分享最近对网站外链跳转页面代码的一些改善
最近,有了一些灵感以及在其他博客也吸收了一些相关经验,就把现用的外链代码小改了下,感觉还不错,现在分享下,喜欢的可以试试。
用户8099761
2023/05/11
8090
Vue入门 基本使用 与 事务管理【1】
Vue (读音 /vjuː/,类似于 view) 是一套用于构建用户界面的渐进式JavaScript框架。
陶然同学
2023/02/24
9510
Vue入门 基本使用 与 事务管理【1】
webApis06-navigator、history、本地存储、线程、数组方法、正则表达式
navigator对象 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>薪资想过万,代码敲三遍</title> </head> <b
yuanshuai
2022/08/17
3580
推荐阅读
相关推荐
【javaScript案例】之支付10秒倒计时
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验