五个维度,解析 Spring 中 @Autowired 和 @Resource 的区别

news2024/9/27 21:27:42

@Autowired注解是由Spring提供的,它可以用来对构造方法、成员变量及方法参数进行标注,它能够根据对象类型完成自动注入,代码如下:

public class Service {

    // 构造方法注入
    @Autowired
    public Service(Service service) {
        this.service = service;
    }

    // 成员变量注入
    @Autowired
    private Service service;
 
    // 方法参数注入
    @Autowired
    public void setService(Service service) {
        this.service = service;
    }

}

再来看@Resource注解,代码如下:

public class Service {
    
    @Resource(name = "service1")
    private Service service1;
    
    @Resource(name = "service2")
    private Service service2;

    @Reource
    private Service service3;
 
    @Reource
    private Service service4;

}

它是由JDK提供的,遵循JSR-250规范,是JDK 1.6及以上加入的新特性。作为Java的标准,它的作用和@Autowired无区别。与@Autowired不同的是,它适用于所有的Java框架,而@Autowired只适用于Spring。可以简单地理解为,@Resource能够支持对象类型注入,也能够支持对象名称注入。

@Resource和@Autowired之间具体有哪些区别呢?

可以从以下5个方面来分析。

1、注解内部定义的参数不同

@Autowired只包含一个required参数,默认为true,表示开启自动注入。

public @interface Autowired {

    // 是否开启自动注入,在不开启自动装配时,可设为false
    boolean required() default true;
 
}

 @Resource 包含7个参数,其中最重要的两个是name和type。

public @interface Resource {

    //资源的JNDI名称。在spring的注入时,指定bean的唯一标识。
    String name() default "";
 
    //引用指向的资源的名称。它可以使用全局JNDI名称链接到任何兼容的资源。
    String lookup() default "";
 
    //Java类,被解析为Bean的类型
    Class<?> type() default java.lang.Object.class;
 
    //身份认证的类型
    enum AuthenticationType {
         CONTAINER,
         APPLICATION
    }
 
    //指定资源的身份验证类型。它只能为任何受支持类型的连接工厂的资源指定此选项,而不能为其他类型的资源指定此选项。
    AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
 
   //指定此资源是否可以在此组件和其他组件之间共享。
    boolean shareable() default true;
 
    //指定资源的映射名称。
    String mappedName() default "";
 
    //指定资源的描述。
    String description() default "";

}

2、装配方式的默认值不同

@Autowired默认按type自动装配,而@Resource默认按name自动装配。@Resource注解可以自定义选择装配方式,如果指定name,则按name自动装配。如果指定type,则按type自动装配。

3、注解应用的范围不同 

@Autowired能够用在构造方法、成员变量、方法参数及注解上,而@Resource能用在类、成员变量和方法参数上,源码如下。

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired { ... }
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {  ... }

4、出处不同

@Autowired是Spring定义的注解,而@Resource遵循JSR-250的规范,定义在JDK中。所以@Autowired只能在Spring框架下使用,而@Resource则可以与其他框架一起使用。

5、装配顺序不同 

@Autowired默认先与byType进行匹配,如果发现找到多个Bean,则又按照byName方式进行匹配,如果还有多个Bean,则报出异常。装配顺序如下图所示。

 

而@Resource的装载顺序分为如下4种情况。

1)如果同时指定name和type,则从Spring上下文中找到与它们唯一匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。

2)如果指定name,则从上下文中查找与名称(ID)匹配的Bean进行装配,如果找不到则抛出异常,具体流程如下图所示。

3)如果指定type,则从上下文中找到与类型匹配的唯一Bean进行装配,如果找不到或者找到多个就会抛出异常,具体流程如下图所示。 

4)如果既没有指定name,也没有指定type,则自动按byName方式进行装配。如果没有匹配成功,则仍按照type进行匹配,具体流程如下图所示。

 

下面这张表可以帮助更好地理解和区分@Autowired和@Resource。

 总结一下,两者在功能上差别不大,使用起来也差不多。但是,在日常开发中建议使用@Autowired,有以下3个理由。

  • @Autowired功能略强大。支持优先注入、可以配置允许Bean不存在。

  • 若使用Spring框架,则使用其特有的注解更好一点。

  • 有人认为@Resource更加通用,因为它是一个规范,其他框架也会支持。目前后端都在用Spring,没有必要考虑其他框架。

面试点评:我们可以直接告诉面试官这两个注解的差异,同时基于两个注解的特性解释更多的差异,这样可以更好地体现自己对这方面知识的理解深度。面试官想考查求职者对Spring依赖注入方式的理解,以及对@Autowired和@Resource两个注解底层实现方面的区别的理解。求职者在理解了底层实现的差异后,回答这个问题会比较容易。

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

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

相关文章

实现一个转盘随机选择器

实现效果 完整代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title><…

Java的Stream流详细讲解

一.Stream 是什么 Stream是Java 8新增的重要特性, 它提供函数式编程支持并允许以管道方式操作集合. 流操作会遍历数据源, 使用管道式操作处理数据后生成结果集合, 这个过程通常不会对数据源造成影响。 ​ 同时stream不是一种数据结构&#xff0c;它只是某种数据源的一个视图&…

Neo4j desktop在界面上使用dump备份还原

Neo4j数据库的版本在4.4版本中有dump &#xff08;Neo4j 3.5的版本没有dump文件&#xff09;&#xff0c;选中某个数据库可以使用dump导出一个.dump文件。 导出后的文件 导入dump文件&#xff0c;创建新的数据库

基于InteloneAPI的油锅爆燃预警系统

基于InteloneAPI的油锅爆燃预警系统 前言一、方案介绍1.系统概述2.设计思路 二、方案实现1.ResNet-18模型2.Intel OneAPI AI Kit 使用1.Intel Neural Compressor&#xff1a;2.Intel Optimization for PyTorch* 三、方案价值总结 前言 家居场景下&#xff0c;最容易起火的原因…

selenium自动化登录(实战解析)

目录 1.纯英文验证码 1.首先需要了解运行所需要的模块 2.获取我们的目标地址链接 3.进入古诗词首页面&#xff0c;找到验证码的标签&#xff0c;获取并且保存 4.调用超级鹰打码平台 5.调用超级鹰内的方法 6.输入账号密码 7.模拟登陆需要用cookie保持登陆状态 相信有很多…

人工智能 | 技能人才评价证书分析及人工智能/计算机类证书推荐

目录 简介技能人才评价证书相关介绍1. 国家职业资格证书2. 职业技能等级证书 推荐证书目录1. 计算机类的国家职业资格证书a. 证书推荐b. “软高***”和“PMP”的区别 2. 计算机类的职业技能等级证书a. 工信部认证b. 中国人工智能学会证书 专业证书的作用1. 抵税2. 领取职业技能…

想要让视频素材格式快速调整转换的方法分享

有时候有些视频播放软件不支持播放某些格式的视频文件&#xff1f;那要怎么解决呢&#xff1f;换一个播放软件&#xff1f;不妨试试批量转换视频格式&#xff0c;简单的几步操作就能快速解决烦恼&#xff0c;跟着小编一起来看看具体的操作环节吧。 首先先进入“固乔科技”的官网…

Apikit 自学日记:发起快速测试

功能入口&#xff1a;API管理应用 / 选中某个项目 / API文档菜单 / 选中标签页旁加号 发起快速测试 如果未创建该接口文档&#xff0c;仅临时调试接口&#xff0c;则可创建API快速测试页面。可在这个页面输入接口相关的信息并进行快速测试。具体各协议的测试字段配置&#xf…

NoSQL之Redis配置

NoSQL 一、关系型数据库与非关系型数据库关系型数据库非关系型数据库区别 二、Redis简介Redis的优点Redis的使用场景 三、Redis安装部署四、Redis命令工具redis-cli 命令行工具redis-benchmark 测试工具 五、Redis 数据库常用命令六、Redis多数据库常用命令 一、关系型数据库与…

深入浅出设计模式 - 观察者模式

博主介绍&#xff1a; ✌博主从事应用安全和大数据领域&#xff0c;有8年研发经验&#xff0c;5年面试官经验&#xff0c;Java技术专家✌ Java知识图谱点击链接&#xff1a;体系化学习Java&#xff08;Java面试专题&#xff09; &#x1f495;&#x1f495; 感兴趣的同学可以收…

【Sql】win11系统安装sqlserver2008r2数据库,找不到文件user.config line 5

【问题描述】 在win11系统环境下&#xff0c; 安装sql server 2008 r2数据库的时候&#xff0c;提示【Microsoft.NET Framework】窗口错误。 如果点击继续&#xff0c;应用程序将忽略此错误并尝试继续。 具体错误明细&#xff1a; 创建userSettings/Microsoft.SqlServer.Config…

centos下的Nginx的安装 --yum安装

1.没有可用软件包 nginx 2.检查yum源下nginx相关软件包 3.解决yum源无nginx软件包问题 yum install epel-release yum update更新yum源后查询结果 4.安装nginx yum -y install nginx5.yum安装后的nginx相关目录 6.查看nginx.conf&#xff0c;确定nginx相关具体目录 详细配置…

ECCV2020-DY-RELU

论文地址&#xff1a;https://arxiv.org/abs/2003.10027论文代码&#xff1a;https://github.com/Islanna/DynamicReLU三方复现&#xff1a;Dynamic ReLU: 与输入相关的动态激活函数 - 知乎 ReLU是深度学习中很重要的里程碑&#xff0c;简单但强大。目前有很多ReLU的改进版&am…

【uniapp学习之分享小程序页面】

一、设置分享功能之前的样子 二、在代码中开启分享转发按钮 <script>export default {data() {return {}},methods: {},onLoad() {wx.showShareMenu({withShareTicket: true,menus: [shareAppMessage, shareTimeline]});},onShareAppMessage(res) { //发送给朋友return …

C1. Make Nonzero Sum (easy version) - 思维

分析&#xff1a; n一但是奇数就一定不行&#xff0c;因为无论有多少-1和1都会导致最后的和是-1或1&#xff0c;每次断开一个区间会改变2&#xff0c;所以一定不行&#xff0c;直接输出-1。 其次&#xff0c;如果数组满足题意也可以一个一个输出每一个下标&#xff0c;遍历数组…

4 测试分类

文章目录 总结:课程笔记 总结: 课程笔记

I/O复用的高级应用三——同时处理TCP和UDP服务

截至目前学习&#xff0c;我们讨论过的服务器程序都只监听一个端口。但在实际应用中&#xff0c;有不少服务器程序能同时监听多个端口&#xff0c;比如超级服务inetd和android的调试服务adbd。 从bind系统调用的参数看&#xff0c;一个socket只能与一个socket地址绑定&#xff…

聚焦 5 大技术领域,腾讯2023 年度犀牛鸟开源人才培养计划启动报名

如今&#xff0c;开源已成为全球科技创新的重要方式&#xff0c;而人才建设则是中国开源生态健康发展的关键。 6 月 28 日&#xff0c;在开放原子校源行清华大学站上&#xff0c;腾讯 2023 年度犀牛鸟开源人才培养计划正式启动&#xff0c;将聚焦AI、大数据、数据库、基础软件…

MATLAB代码:配网节点电价 DLMP 考虑网损,电压,阻塞的配电网二阶锥节点电价 (DLMP)需要gurobi求解器

MATLAB代码&#xff1a;配网节点电价 DLMP 关键词&#xff1a;DLMP SOCP lindistflow 参考文档&#xff1a;《Distribution Locational Marginal Pricing (DLMP) for Congestion Management and Voltage Support》2018 SCI一区 IEEE Transactions on Power System 非完美复现 …

使用 Jetpack Compose 构建 CircularProgressIndicator

欢迎阅读这篇关于如何使用 Jetpack Compose 构建 CircularProgressIndicator&#xff08;圆形进度指示器&#xff09;的博客。Jetpack Compose 是 Google 推出的一款现代化 UI 工具包&#xff0c;用于构建 Android 界面。其声明式的设计使得 UI 开发更加简洁、直观。 一、什么…