SpringBoot | @Autowired 和 @Resource 的区别及原理分析
关注:CodingTechWork
引言
在Spring框架中,@Autowired 和 @Resource 是两种常用的依赖注入注解,它们都用于自动装配Bean,简化了开发者手动创建和管理Bean的繁琐工作。然而,它们的实现机制和使用方式有所不同。理解这两者的区别和使用场景,对于优化Spring应用的开发过程非常重要。
本文将深入探讨 @Autowired 和 @Resource 的原理、区别以及如何在实际开发中根据需求选择合适的注解。
@Autowired 注解
介绍
@Autowired是Spring框架提供的注解,旨在实现自动注入依赖。它通常用于自动装配Bean时,通过Spring容器找到匹配的Bean,并将其注入到标注了@Autowired的字段、构造方法或Setter方法中。
工作原理
@Autowired默认按 类型 自动装配(即通过Bean的类型匹配进行注入)。- 如果存在多个相同类型的Bean,则Spring容器会根据名称(或者其他标识)来决定注入哪一个Bean。此时,如果没有明确标注
@Qualifier,会抛出NoUniqueBeanDefinitionException异常。 - 可以通过设置
@Autowired(required=false)来实现可选依赖注入,意味着如果容器中没有找到匹配的Bean,则不进行注入,避免抛出异常。
示例代码
- UserService类
@Component
public class UserService {// 自动注入UserRepository@Autowiredprivate UserRepository userRepository;public void performAction() {userRepository.save();}
}
- UserRepository类
@Component
public class UserRepository {public void save() {System.out.println("Saving user...");}
}
- AppConfig类
@Configuration
@ComponentScan("com.example") // 自动扫描指定包中的所有组件
public class AppConfig {
}
在上面的示例中,UserService类中的userRepository被@Autowired注解自动注入。Spring会根据类型(即UserRepository)来注入对应的Bean。
常见问题与解决方案
- 多个同类型的Bean:如果容器中有多个
UserRepository类型的Bean,Spring会抛出NoUniqueBeanDefinitionException。可以通过@Qualifier来指定注入哪个Bean:
@Autowired
@Qualifier("specificUserRepository")
private UserRepository userRepository;
- 可选依赖:如果某个Bean是可选的,可以设置 @Autowired(required=false):
// 这样如果没有找到对应的Bean,Spring不会抛出异常,而是将 userRepository 设置为 null。
@Autowired(required = false)
private UserRepository userRepository;
@Resource 注解
介绍
@Resource是Java的标准注解(JSR-250规范),在Spring中也得到了支持。它的作用是实现依赖注入,主要通过名称来进行自动装配,如果找不到与名称匹配的Bean,则通过类型来进行匹配。
工作原理
@Resource默认是按名称进行装配。如果容器中存在与字段名称相同的Bean,Spring会自动注入该Bean。- 如果容器中没有与字段名称匹配的Bean,则会按
类型自动装配。 @Resource还支持设置name属性来指定注入Bean的名称。
示例代码
- UserService
@Component
public class UserService {// 自动注入UserRepository@Resource(name = "userRepository") // 按名称自动装配private UserRepository userRepository;public void performAction() {userRepository.save();}
}
- UserRepository
@Component("userRepository") // 显式指定Bean的名称
public class UserRepository {public void save() {System.out.println("Saving user...");}
}
- AppConfig
@Configuration
@ComponentScan("com.example")
public class AppConfig {
}
在这个示例中,UserService 类中的 userRepository通过@Resource注解按名称装配。如果没有找到名称为 userRepository的Bean,Spring会尝试按类型来装配。
常见问题与解决方案
- 按名称装配失败:如果容器中没有与字段名称匹配的Bean,Spring会尝试按类型进行自动装配。
- 注入失败:如果存在多个符合条件的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来避免冲突 |
选择使用的场景
- 使用
@Autowired:如果你更倾向于按类型自动注入并且希望有更多的灵活性,尤其是在复杂的依赖注入场景中(例如多个同类型的Bean时),@Autowired是一个更好的选择。 - 使用
@Resource:如果你更倾向于使用标准的Java注解,或者你希望按名称来精确控制注入的Bean,@Resource是一个不错的选择。特别是在已有的Java EE项目中,使用@Resource可以更好地保证兼容性。
小结
@Autowired主要依赖于Spring的自动装配机制,默认按类型装配,提供更多的灵活性。@Resource是Java EE规范中的注解,按名称装配,若未找到则按类型装配,适用于更精确控制Bean的注入。- 在实际使用中,二者各有优势,可以根据具体需求来选择使用。对于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]。 …...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?
编辑:陈萍萍的公主一点人工一点智能 未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战,在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…...
7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...
进程地址空间(比特课总结)
一、进程地址空间 1. 环境变量 1 )⽤户级环境变量与系统级环境变量 全局属性:环境变量具有全局属性,会被⼦进程继承。例如当bash启动⼦进程时,环 境变量会⾃动传递给⼦进程。 本地变量限制:本地变量只在当前进程(ba…...
【Oracle APEX开发小技巧12】
有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
初学 pytest 记录
安装 pip install pytest用例可以是函数也可以是类中的方法 def test_func():print()class TestAdd: # def __init__(self): 在 pytest 中不可以使用__init__方法 # self.cc 12345 pytest.mark.api def test_str(self):res add(1, 2)assert res 12def test_int(self):r…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
