@Autowired和@Resource注解的区别和联系
直接看原文
原文链接:
【精选】@Autowired和@Resource注解的区别和联系【精选】
-------------------------------------------------------------------------------------------------------------------------------
先说联系
联系
- @Autowired和@Resource注解都是作为bean对象注入的时候使用的
- 两者都可以声明在字段和setter方法上
注意:如果声明在字段上,那么就不需要再写setter方法。但是本质上,该对象还是作为set方法的实参,通过执行set方法注入,只是省略了setter方法罢了
区别
- @Autowired注解是Spring提供的,而@Resource注解是J2EE本身提供的
- @Autowird注解默认通过byType方式注入,而@Resource注解默认通过byName方式注入
- @Autowired注解注入的对象需要在IOC容器中存在,否则需要加上属性required=false,表示忽略当前要注入的bean,如果有直接注入,没有跳过,不会报错
对于byName和byType方式不太熟悉的可以看一下这里:Spring中的byName与byType
简单来说,byName就是变量名去匹配bean的id属性,而byType则是变量类型去匹配bean的class属性
<bean id="userService" class="com.test.UserServiceImpl">
</bean>
@Autowired
private UserService userService;
此处byName就是拿变量名userService去匹配IOC容器的iduserService,匹配成功;而byType就是拿变量类型UserService去匹配IOC容器的idcom.test.UserService.UserServiceImpl,因为UserServiceImpl是UserService实现,所以也匹配成功
接下来再分别讲讲@Autowired注解和@Resource注解的使用
@Autowird注解的使用
步骤:@Autowird默认的注入方式为byType,也就是根据类型匹配,当有多个实现时,则通过byName注入,也可以通过配合@Qualifier注解来显式指定name值,指明要使用哪个具体的实现类
举例:
首先有一个接口UserService和两个实现类UserServiceImpl1和UserServiceImpl2,并且这两个实现类已经加入到Spring的IOC容器中了
@Service
public class UserServiceImpl1 implements UserService@Service
public class UserServiceImpl2 implements UserService
在spring容器中的配置体现就是下面的, 下面的id默认就是类名首字母的小写,class就是全类名.
<bean id="userServiceImpl1 " class="com.test.UserServiceImpl1">
</bean>
<bean id="userServiceImpl2 " class="com.test.UserServiceImpl2">
</bean>
通过@Autowired注入使用
@Autowired
private UserService userService;
根据上面的步骤,可以很容易判断出,直接这么使用是会报错的
原因:首先通过byType注入(就是拿UserService去容器里找有么有UserService或者实现类是UserService的),判断UserService类型有两个实现,无法确定具体是哪一个,于是通过byName方式(就是拿变量名去和容器里id比较),这里的变量名userService也无法匹配IOC容器中id(此处指的userServiceImpl1和userServiceImpl2),于是报错。
注意:通过注解注入到IOC容器的id值默认是其类名首字母小写
解决方案
方式一:
// 方式一:改变变量名
@Autowired
private UserService userServiceImpl1;
方式二:
// 方式二:配合@Qualifier注解来显式指定name值
@Autowired
@Qualifier(value = "userServiceImpl1")
private UserService userService;
@Resource注解的使用
步骤:@Resource默认通过byName注入,如果没有匹配则通过byType注入
举例:
@Service
public class UserServiceImpl1 implements UserService@Service
public class UserServiceImpl2 implements UserService
@Resource
private UserService userService;
首先通过byName匹配,变量名userService无法匹配IOC容器中任何一个id(这里指的userServiceImpl1和userServiceImpl2),于是通过byType匹配,发现类型UserService的实现类有两个,仍然无法确定,于是报错。
同时@Resource还有两个重要的属性:name和type,用来显式指定byName和byType方式注入
使用:对应4种情况
// 1. 默认方式:byName
@Resource
private UserService userDao; // 2. 指定byName
@Resource(name="userService")
private UserService userService; // 3. 指定byType
@Resource(type=UserService.class)
private UserService userService; // 4. 指定byName和byType
@Resource(name="userService",type=UserService.class)
private UserService userService;
- 既没指定name属性,也没指定type属性:默认通过byName方式注入,如果byName匹配失败,则使用byType方式注入(也就是上面的那个例子)
- 指定name属性:通过byName方式注入,把变量名和IOC容器中的id去匹配,匹配失败则报错
- 指定type属性:通过byType方式注入,在IOC容器中匹配对应的类型,如果匹配不到或者匹配到多个则报错
- 同时指定name属性和type属性:在IOC容器中匹配,名字和类型同时匹配则成功,否则失败
相关文章:
@Autowired和@Resource注解的区别和联系
直接看原文 原文链接: 【精选】Autowired和Resource注解的区别和联系【精选】 ------------------------------------------------------------------------------------------------------------------------------- 先说联系 联系 Autowired和Resource注解都是作为bean…...
设计模式类型
创建型模式 创建型模式(Creational Pattern)对类的实例化过程进行了抽象,能够将软件模块中对象的创建和对象的使用分离。为了使软件的结构更加清晰,外界对于这些对象只需要知道它们共同的接口,而不清楚其具体的实现细节,使整个系…...
Android修行手册-实现利用POI将图片插入到Excel中(文末送书)
点击跳转>Unity3D特效百例点击跳转>案例项目实战源码点击跳转>游戏脚本-辅助自动化点击跳转>Android控件全解手册点击跳转>Scratch编程案例点击跳转>软考全系列 👉关于作者 专注于Android/Unity和各种游戏开发技巧,以及各种资源分享&…...
低功耗工业RFID设备应用
随着工业自动化的迅速发展,RFID技术也在工业领域得到了广泛的应用,在近距离非接触读写应用时,常常利用低功耗的工业RFID设备来进行识别,下面我们将详细介绍低功耗工业RFID设备的应用。 低功耗工业RFID设备具有功耗低、体积小、重量…...
# Oracle 库常见问题排查
Oracle 库常见问题排查 文章目录 Oracle 库常见问题排查查询数据库的相关信息查看正在执行的语句杀掉正在执行的sql查看未提交的事务查看锁表 查询数据库的相关信息 查看正在执行的语句 SELECT s.sid, s.serial#, s.username, s.status, s.sql_id, s.sql_child_number, sq.sq…...
矩阵乘积的迹对矩阵求导
说明 有时候为了输入方便,B和都代表B的转置。 矩阵的在线计算有个网站可以参考:Matrix Calculus dtr(AB)/dAB 下面用一个例子来证明。 dtr(ABA)/dAABAB 下面用一个例子来证明: 因为我们要求ABA的迹,所以为了简便,我们…...
IP 地址冲突检测工具
IP 冲突是一个术语,用于表示同一网络或子网中尝试使用相同 IP 地址的两个或多个设备的状态,这可能会导致发往特定主机的通信与其他主机混淆,因为两者都使用相同的 IP,为了避免这种情况,某些主机在发生 IP 冲突时会失去…...
js树形数组遍历练习,扁平化、格式化、获取节点父级
1.树形数组扁平化 数组扁平化的方式很多,这里主要是用递归处理,除此之外还有正则、扩展运算符等等 const list [{name:1,id:1,children:[{name:11,id:11,children:[{name:111,id:111}]},{name:12},]},{name:2,id:2,children:[{name:21,id:21,children:…...
c语言贪吃蛇项目的实现
ncurse的引入 ncurse的概念 ncurse(new curses)是一套编程库,它提供了一系列的函数,以便使用者调用它们去生成基于文本的用户界面。 ncurses是一个能提供功能键定义(快捷键),屏幕绘制以及基于文本终端的图形互动功能的动态库。ncurses用得最多的地方是…...
IDEA运行前端vue项目,安装nodejs,以及配置
我在刚接手到一个项目的时候,不知道前端的代码的情况下,想要写后端代码,遇到问题 所以需要看前台代码,着手IDEA 开始 安装nodejs (为什么要安装nodejs呢,首先就是说需要npm, 而nodejs 内置npm) 1.从官网下载 nodej…...
SAP S4后的一些注意点(一)(更新中)
SAP 此外,我们必须确保 P10 中所有新的 Unicore 代码都是云就绪的。因此,在 ATC 中增加了一项新的检查(自定义),以证明代码的云就绪性。此外,我们还在 ADT 中安装了一个名为 ABAP Cleaner 的新插件…...
Python高级语法----深入asyncio:构建异步应用
文章目录 异步I/O操作示例:异步网络请求异步任务管理示例:并发执行多个任务使用异步队列示例:生产者-消费者模式在现代软件开发中,异步编程已经成为提高应用性能和响应性的关键技术之一。Python的asyncio库为编写单线程并发代码提供了强大的支持。本文将深入探讨asyncio的三…...
5-爬虫-打码平台、打码平台自动登录打码平台、selenium爬取京东商品信息、scrapy介绍安装、scrapy目录结构
1 打码平台 1.1 案例 2 打码平台自动登录打码平台 3 selenium爬取京东商品信息 4 scrapy介绍安装 5 scrapy目录结构 1 打码平台 # 1 登录某些网站,会有验证码---》想自动破解-数字字母:python模块:ddddocr-计算题,成语题…...
HTTPS 的工作原理是什么?
HTTPS(HyperText Transfer Protocol Secure)是一种通过加密和认证保护数据传输安全的通信协议。它是基于传统的 HTTP 协议,通过使用 SSL(Secure Sockets Layer)或 TLS(Transport Layer Security)…...
【STM32】TIM2的PWM:脉冲宽度调制
PWM是一种周期固定,脉宽可调整的输出波形。 0.通用寄存器输出 1.捕获/比较通道1的主电路--中间部分 2.捕获/比较通道的输出部分--输出 3.通用定时器输出PWM原理 PWM波周期或者频率由ARR(就是要进递增/递减的值)决定,PWM波占空比由…...
DRF 学习
一、安装DRF 1、pip install djangorestframework -i https://pypi.douban.com/simple 2、pip install pymysql -i https://pypi.douban.com/simple 二、创建Django项目 1、django-admin startproject drfdemo 三、添加rest_framework应用 1、INSTALLED_APPS …...
2023年双11有哪些便宜的云服务器值得推荐?
每年的双11期间各大云计算服务商都会推出特价云服务器,今年自然也不例外,下面给大家分享2023年双11有哪些便宜的云服务器值得推荐。 1、阿里云【传送门>>>】 阿里云双11推出了金秋云创季活动,2核2G3M不限流量,1年99元&…...
[Java/力扣160]相交链表
这道题的关键是,使两个链表上的指针同时到达相交点处 方法一:分别遍历两个链表,得到其长度。然后先让较长的链表上的指针走“两链表长度之差”。然后两指针分别一步一步走,就能同时到达相交点处。 方法二:让 p1 遍历…...
LLVM学习笔记(60)
4.4.3. X86Subtarget 在X86TargetMachine构造函数的105行调用了X86Subtarget构造函数来创建具体的目标机器对象。 4.4.3.1. FMV的支持(v7.0) V7.0将具体目标机器对象的生成推迟到第一次调用getSubtarget ()时才创建。不过,为了方便起见&am…...
Linux命令查看pcap包报文数量、包体包含内容、包长
查看pcap包内容 要查看pcap文件中的包数量,可以使用网络分析工具,如Wireshark或Tcpdump,或者使用编程语言中的网络分析库,如Python中的Scapy或Sniffy。 使用Wireshark的方法如下: 打开Wireshark软件。选择要查看的p…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态
前言 在人工智能技术飞速发展的今天,深度学习与大模型技术已成为推动行业变革的核心驱动力,而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心,系统性地呈现了两部深度技术著作的精华:…...
Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
