当前位置: 首页 > news >正文

SpringBoot | @Autowired 和 @Resource 的区别及原理分析

关注:CodingTechWork

引言

  在Spring框架中,@Autowired 和 @Resource 是两种常用的依赖注入注解,它们都用于自动装配Bean,简化了开发者手动创建和管理Bean的繁琐工作。然而,它们的实现机制和使用方式有所不同。理解这两者的区别和使用场景,对于优化Spring应用的开发过程非常重要。
  本文将深入探讨 @Autowired 和 @Resource 的原理、区别以及如何在实际开发中根据需求选择合适的注解。

@Autowired 注解

介绍

  @Autowired是Spring框架提供的注解,旨在实现自动注入依赖。它通常用于自动装配Bean时,通过Spring容器找到匹配的Bean,并将其注入到标注了@Autowired的字段、构造方法或Setter方法中。

工作原理

  1. @Autowired 默认按 类型 自动装配(即通过Bean的类型匹配进行注入)。
  2. 如果存在多个相同类型的Bean,则Spring容器会根据名称(或者其他标识)来决定注入哪一个Bean。此时,如果没有明确标注 @Qualifier,会抛出NoUniqueBeanDefinitionException异常。
  3. 可以通过设置@Autowired(required=false)来实现可选依赖注入,意味着如果容器中没有找到匹配的Bean,则不进行注入,避免抛出异常。

示例代码

  1. UserService类
@Component
public class UserService {// 自动注入UserRepository@Autowiredprivate UserRepository userRepository;public void performAction() {userRepository.save();}
}
  1. UserRepository类
@Component
public class UserRepository {public void save() {System.out.println("Saving user...");}
}
  1. AppConfig类
@Configuration
@ComponentScan("com.example") // 自动扫描指定包中的所有组件
public class AppConfig {
}

在上面的示例中,UserService类中的userRepository@Autowired注解自动注入。Spring会根据类型(即UserRepository)来注入对应的Bean。

常见问题与解决方案

  1. 多个同类型的Bean:如果容器中有多个UserRepository类型的Bean,Spring会抛出 NoUniqueBeanDefinitionException。可以通过@Qualifier来指定注入哪个Bean:
@Autowired
@Qualifier("specificUserRepository")
private UserRepository userRepository;
  1. 可选依赖:如果某个Bean是可选的,可以设置 @Autowired(required=false):
// 这样如果没有找到对应的Bean,Spring不会抛出异常,而是将 userRepository 设置为 null。
@Autowired(required = false)
private UserRepository userRepository;

@Resource 注解

介绍

  @Resource是Java的标准注解(JSR-250规范),在Spring中也得到了支持。它的作用是实现依赖注入,主要通过名称来进行自动装配,如果找不到与名称匹配的Bean,则通过类型来进行匹配。

工作原理

  1. @Resource 默认是按名称进行装配。如果容器中存在与字段名称相同的Bean,Spring会自动注入该Bean。
  2. 如果容器中没有与字段名称匹配的Bean,则会按类型自动装配。
  3. @Resource还支持设置name属性来指定注入Bean的名称。

示例代码

  1. UserService
@Component
public class UserService {// 自动注入UserRepository@Resource(name = "userRepository") // 按名称自动装配private UserRepository userRepository;public void performAction() {userRepository.save();}
}
  1. UserRepository
@Component("userRepository") // 显式指定Bean的名称
public class UserRepository {public void save() {System.out.println("Saving user...");}
}
  1. AppConfig
@Configuration
@ComponentScan("com.example")
public class AppConfig {
}

在这个示例中,UserService 类中的 userRepository通过@Resource注解按名称装配。如果没有找到名称为 userRepository的Bean,Spring会尝试按类型来装配。

常见问题与解决方案

  1. 按名称装配失败:如果容器中没有与字段名称匹配的Bean,Spring会尝试按类型进行自动装配。
  2. 注入失败:如果存在多个符合条件的Bean,且没有明确指定name,Spring会抛出异常,提示找不到唯一匹配的Bean。
    解决方法:可以在 @Resource 注解中显式指定 name 属性。
@Resource(name = "specificUserRepository")
private UserRepository userRepository;

@Autowired 和 @Resource 的主要区别

特性@Autowired@Resource
注解来源Spring框架自定义注解Java标准注解(JSR-250)
默认装配方式按类型自动装配按名称自动装配,若按名称找不到则按类型装配
支持属性required(是否必须注入)name(指定注入的Bean名称)
默认行为如果没有合适的Bean,抛出异常如果没有合适的Bean,按类型装配
配合@Qualifier支持,用于解决多个相同类型Bean的注入冲突不支持,直接使用name来避免冲突

选择使用的场景

  1. 使用@Autowired:如果你更倾向于按类型自动注入并且希望有更多的灵活性,尤其是在复杂的依赖注入场景中(例如多个同类型的Bean时),@Autowired是一个更好的选择。
  2. 使用 @Resource:如果你更倾向于使用标准的Java注解,或者你希望按名称来精确控制注入的Bean,@Resource是一个不错的选择。特别是在已有的Java EE项目中,使用 @Resource可以更好地保证兼容性。

小结

  1. @Autowired主要依赖于Spring的自动装配机制,默认按类型装配,提供更多的灵活性。
  2. @ResourceJava EE规范中的注解,按名称装配,若未找到则按类型装配,适用于更精确控制Bean的注入。
  3. 在实际使用中,二者各有优势,可以根据具体需求来选择使用。对于Spring项目,@Autowired的使用更为广泛,而@Resource适用于标准化Java EE项目。

相关文章:

SpringBoot | @Autowired 和 @Resource 的区别及原理分析

关注:CodingTechWork 引言 在Spring框架中,Autowired 和 Resource 是两种常用的依赖注入注解,它们都用于自动装配Bean,简化了开发者手动创建和管理Bean的繁琐工作。然而,它们的实现机制和使用方式有所不同。理解这两者…...

『SQLite』解释执行(Explain)

摘要:本节主要讲解SQL的解释执行:Explain。 在 sqlite 语句之前,可以使用 “EXPLAIN” 关键字或 “EXPLAIN QUERY PLAN” 短语,用于描述表查询的细节。 基本语法 EXPLAIN 语法: EXPLAIN [SQLite Query]EXPLAIN QUER…...

0基础学前端-----CSS DAY12

视频参考:B站Pink老师 今天是CSS学习的第十二天,今天开始的笔记对应Pink老师课程中的CSS第七天的内容。 本节重点:CSS高级技巧 本章目录 本节目标1. 精灵图1.1 为什么需要精灵图1.2 精灵图使用案例:拼出自己的名字 2. 字体图标2.…...

(概率论)无偏估计

参考文章:(15 封私信 / 51 条消息) 什么是无偏估计? - 知乎 (zhihu.com) 首先,第一个回答中,马同学图解数学讲解得很形象, 我的概括是:“注意,有一个总体的均值u。然后,如果抽样n个&…...

Minio-Linux-安装

文章目录 1.Linux安装1.下载源码包2.上传到/usr/local/minio1.进入目录2.上传 3.开放执行权限4.创建minio文件存储目录及日志目录5.编写启动的shell脚本1.脚本编写2.赋予执行权限 6.启动!1.执行run脚本2.查看日志3.开放9001和9000端口1.服务器2.安全组3.访问&#x…...

利用Java爬取1688商品详情API接口:技术与应用指南

引言 1688作为中国领先的B2B电子商务平台,拥有海量的商品信息。对于商家和市场研究人员来说,能够从1688获取商品详情信息,对于市场分析、竞品研究等具有重要价值。本文将详细介绍如何使用Java编写爬虫程序,以合法、高效的方式获取…...

基于MATLAB的汽车热管理模型构建

一、引言 汽车热管理系统对汽车性能、部件寿命及驾乘体验至关重要。它能确保发动机、电池等关键部件在适宜温度工作。MATLAB 功能强大,为构建高精度热管理模型提供有效途径,助力优化系统设计与控制策略。 二、汽车热管理系统构成 2.1 发动机冷却系统&…...

LRU(1)

LRU是"Least Recently Used"(最近最少使用)的缩写,它是一种常用的页面置换算法和缓存淘汰策略。当计算机系统的内存或缓存资源有限时,LRU算法根据的历史访问记录来决定哪些数据应该被保留在内存或缓存中,哪些被淘汰。其核心思想是“…...

VSCode 使用鼠标滚轮控制字体

一、 文件 | 首选项 | 设置 二、单击在 settings.json中编辑 "editor.mouseWheelZoom": true 注注注意:保存哦!ctrlS 三、测试 按住ctrl鼠标滚轮,控制字体大小...

数据库(3)--针对列的CRUD操作

1.Create 新增 语法: insert into 表名 (列名)values (列)... 创建一个学生表用于演示: create table if not exists student( id bigint comment 编号, name varchar(20) comment 姓名 ); 1.1直接增加…...

【Linux】记录一下考RHCE的学习过程(七)

年底了,公司接的北京地铁轨道交通的项目做不完了,一百多列地铁的设备都得调,派我出差了几周,这几天才回来,出差累死了实在是没办法更新。(YOASOBI的二开票还没抢到ToT,哭死,看看回滚…...

【顶刊TPAMI 2025】多头编码(MHE)之极限分类 Part 1:背景动机

目录 1 简单概括2 几个重要发现3 主要贡献4 背景知识5 方法简介 论文:Multi-Head Encoding for Extreme Label Classification 作者:Daojun Liang, Haixia Zhang, Dongfeng Yuan and Minggao Zhang 单位:山东大学 代码:https://gi…...

使用hardhat进行合约测试

演示源码:hardhat-demo: 演示基于hardhat的HelloWord合约测试案例。 环境 NodeJs 创建工程 1.创建一个hardhat工程根目录(hardhat-demo),然后进入该目录执行。 npx hardhat执行该命令,会进行hardhat工程初始化。 提示我们是否安装该版本h…...

基于生成式对抗网络(GAN)的前沿研究与应用

引言 人工智能(AI)领域在过去几年中经历了快速的发展,尤其是深度学习的兴起带来了许多变革。其中,生成式对抗网络(Generative Adversarial Network, GAN)因其强大的生成能力成为了研究热点。自2014年Ian G…...

Apache zookeeper集群搭建

文章目录 引言I 集群搭建保证服务器基础环境一致JDK安装与配置环境变量安装与修改zk配置文件同步zk安装包与配置文件zk集群启停查看进程、状态、日志II 扩展:shell脚本一键启停引言 springCloud 脚手架项目功能模块:Java分布式锁 https://blog.csdn.net/z929118967/article/d…...

cmake使用记录

Android相关 编译一个动态库,到指定的目录 cmake_minimum_required(VERSION 3.22.1) set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/../v2x_algo_output/${ANDROID_ABI}) project("serial_port") include_directories(include) add_…...

nginx http反向代理

系统:Ubuntu_24.0.4 1、安装nginx sudo apt-get update sudo apt-get install nginx sudo systemctl start nginx 2、配置nginx.conf文件 /etc/nginx/nginx.conf,但可以在 /etc/nginx/sites-available/ 目录下创建一个新的配置文件,并在…...

实数的奥秘:柯西序列深度解析

实数的奥秘:柯西序列深度解析 一、柯西序列的概念与性质二、柯西序列定义无理数三、柯西序列定义实数系统 实数,是初中学到的概念,我知都知道它是有理数和无理数的统称。 然而,实数可不只是小数点后的一堆零碎儿,它背后…...

信息系统管理师试题-人力资源

信息系统管理师试题-人力资源 当组织计划的人力资源需求超过供给时,可通过下列方法解决,其中不包括() A降低录用标准,招聘新员工 B增加临时性员工和使用退休员工 C减少加班数量或工作时间 D提高员工工作效率 答案C 下…...

补偿电阻对ota零极点的影响

本文内容主要是关于补偿电阻对零极点产生的影响。 1.极点分析 该补偿电阻并不会影响在输出端的主极点,受影响的主要是镜像极点。 这里我们可以先单看电流镜部分,这个补偿电阻的作用在于将极点推向原来的两倍,从而达到增加带宽的目的[1]。 …...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...

centos 7 部署awstats 网站访问检测

一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats&#xff0…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet,点击确认后如下提示 最终上报fail 解决方法 内核升级导致,需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练

前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

【决胜公务员考试】求职OMG——见面课测验1

2025最新版!!!6.8截至答题,大家注意呀! 博主码字不易点个关注吧,祝期末顺利~~ 1.单选题(2分) 下列说法错误的是:( B ) A.选调生属于公务员系统 B.公务员属于事业编 C.选调生有基层锻炼的要求 D…...

LLM基础1_语言模型如何处理文本

基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

AI书签管理工具开发全记录(十九):嵌入资源处理

1.前言 📝 在上一篇文章中,我们完成了书签的导入导出功能。本篇文章我们研究如何处理嵌入资源,方便后续将资源打包到一个可执行文件中。 2.embed介绍 🎯 Go 1.16 引入了革命性的 embed 包,彻底改变了静态资源管理的…...

中医有效性探讨

文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)​现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...

HDFS分布式存储 zookeeper

hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...

Spring是如何解决Bean的循环依赖:三级缓存机制

1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间‌互相持有对方引用‌,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...