Spring框架@Autowired和@Resource到底有什么区别

news2024/11/26 11:46:13

目录

    • 1 来源不同
    • 2.依赖查找顺序不同
      • 2.1 @Autowired 查找顺序
      • 2.2 @Resource 查找顺序
      • 2.3 查找顺序小结
    • 3.支持的参数不同
    • 4.依赖注入的支持不同
    • 5.编译器提示不同
    • 6 总结


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 {
    // 属性注入
    @Autowired
    private UserService userService;
 
    @RequestMapping("/add")
    public UserInfo add(String username, String password) {
        return userService.add(username, password);
    }
}

b) 构造方法注入

@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 注入

@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 就不会出现报错信息了,具体实现如下:

6 总结

@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 注解则不会提示错误。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1009194.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

从命令行管理文件

1.linux系统中硬盘文件存储原理 硬连接 1.1.原理 linux系统中允许多个文件指向同一个inode,即允许一个文件拥有多个有效的路径名和文件名。 理解:硬连接就是指向原始文件的inode指针 证明一: 创建一个文件t1 查看他的硬链接数 创建一个硬链接 …

一阶微分方程

目录 可分离变量的方程 齐次微分方程 一阶线性微分方程 伯努科方程 全微分方程 可分离变量的方程 可分离变量的方程是一种常见的一阶常微分方程类型,其特点是可以通过将变量分离到方程的两侧,从而可以分别对各自变量进行积分。一般形式的可分离变量…

武汉融资融券(两融)开户利率最低能做到多少?无门槛利率5%!

武汉融资融券(两融)开户利率最低能做到多少?无门槛利率5%! 具体武汉融资融券(两融)开户利率最低能做到多少,需要根据不同的券商政策而定。不同的券商可能具有不同的优惠政策和开户条件,因此开户前应该仔细了解券商的政策和条件。 融资融券是指投资者通…

Minio入门系列【2】纠删码

1 纠删码 Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据 1.1 什么叫纠删码 纠删码是一种用于重建丢失或损坏数据的数学算法。 纠删码(e…

SQL注入类型判断

SQL注入的类型分为字符型和数字型,以sqli-labs靶场1、2关为例: 文章目录 第一关第二关无错误回显的判断 第一关 第一关注入一个1’,错误回显出下面内容,其中1’是注入的内容,0,1后面的单引号和最前面的单引号是一对&am…

湖北中级工程师职称网上申报流程是怎么样?应该如何在网上填写申报信息呢?

现在湖北中级职称全部采取网上申报形式,不管是水测还是后面职称评审都是需要网上申报信息,那么中级职称评审,网上如何申报信息呢?填写信息的时候需要注意哪些方面呢?今天甘建二这边给大家整理一下,希望对大…

电动垂直起降飞行器的发展现状

摘要 近年来,电动垂直起降(eVTOL)飞行器在城市空运中得到快速发展。本文介绍了近5年来世界范围内主要的在研电动垂直起降飞行器项目,从飞行器布局形式、总体设计参数、推进系统类型、飞行控制等级等方面进行了归纳和总结,分析了不同构型下相应电动垂直起…

Redis 五大类型源码及底层实现

面试题: 谈谈Redis数据类型的底层数据结构: SDS动态字符串双向链表玉缩列表ziplist哈希表hashtable跳表kiplist整数集合intset快速列表quicklist紧凑列表listpack Redis源代码的核心部分 官网:GitHub - redis/redis: Redis is an in-memory…

jenkins自动化脚本集成时钉钉消息未发送

在进行jenkins自动化脚本集成时,需要配置钉钉发送消息。钉钉的配置正确,测试钉钉消息发送成功,但是当构建项目时,却没有收到钉钉消息,报错如下: [钉钉插件]发送消息时报错: java.lang.NullPointerExceptio…

项目经理晋升为企业高管,需要杀死自己三次

大家好,我是老原。 “猴子屁股理论”,大家应该都知道吧。 就拿职场来说,它就像是一棵树,从树底下开始爬,一层一层的基层员工-基层干部-中层干部-高层-老板。 你会发现,无论你在哪一层,往上看都…

PyTorch实战-实现神经网络图像分类基础Tensor最全操作详解(二)

前言 PyTorch可以说是三大主流框架中最适合初学者学习的了,相较于其他主流框架,PyTorch的简单易用性使其成为初学者们的首选。这样我想要强调的一点是,框架可以类比为编程语言,仅为我们实现项目效果的工具,也就是我们…

开始使用Filebeat

认识Beats Beats是用于单用途数据托运人的平台。它们以轻量级代理的形式安装,并将来自成百上千台机器的数据发送到Logstash或Elasticsearch。 (画外音:通俗地理解,就是采集数据,并上报到Logstash或Elasticsearch&…

用matlab在hfss中建模

hfss可以导入vbs语言建模 怎么生成建模的vbs文档? 1.在hfss中建模建一遍 导出建模的vbs,然后笔记本打开vbs,需要改的话直接改。 参考 https://blog.csdn.net/m0_56117494/article/details/128007860 一文 这个方法朴实无华 但是需要写vbs语言…

英语单词(6)

1.person 人 2.start 开始 3.menu 菜单 4.login 登录 5.main 主要的 6.document 文档 7.display 显示 8.method 方法,条理 9.version 版本 10parameter 参数

Leecode1160: 拼写单词

直接使用一个哈希表存整体的结果,一个临时的哈希表每次算一遍,但是1是要设置标志位来判断最后是否正确并加上长度,2是千万要记得每次新建一个空间来存哈希表绝对不能不空间就等于,会出事!!

【小吉送书—第三期】Linux私教课:技术内核与企业运维篇

文章目录 🍔查找⭐find命令🎈按文件名🎈按拥有者🎈查找Linux系统下大于200M的文件 ⭐locate命令🎈使用方法 ⭐which命令(查找指令的,而不是文件)🎈使用方法 ⭐grep命令和…

Appium混合页面点击方法tap的使用

原生应用开发,是在Android、IOS等移动平台上利用官方提供的开发语言、开发类库、开发工具进行App开发;HTML5(h5)应用开发,是利用Web技术进行的App开发。目前,市面上很多app都是原生和h5混合开发&#xff0c…

【推荐】SpringMVC与JSON数据返回及异常处理机制的使用

🎬 艳艳耶✌️:个人主页 🔥 个人专栏 :《【推荐】Spring与Mybatis集成整合》 ⛺️ 生活的理想,为了不断更新自己 ! 1.JSON 在SpringMVC中,JSON数据返回通常是通过使用ResponseBody注解将Java对象转换为JSO…

2023年有哪些值得推荐的深度学习书?

深度学习指的是用一种特定的方法来解决一些机器学习的问题。 这种方法的中心思想是:基于一系列的离散的层(layer) 构建机器学习算法。如果将这些层 垂直堆叠,就说这个结果是有深度 (depth)的,或…

淘宝新品店铺运营必做的任务!

首先我们需要知道,新品上线前需要进行私域预热,以便达到上新后的销量效果,那上线后的运营又该怎么做呢? “ 完成新品孵化任务 进入【千牛后台】-【商品】-【新品运营】 这里可以看到淘宝针对新品扶持新开的板块,可以…