5. @Autowired与@Resource的区别

在上一节我们使用Autowired进行了bean的装配,@Autowired与@Resource都可以用来装配bean,但它们之前还是有一些区别,它们的区别具体体现为以下几点:

  • 来源不同
  • 对Constructor注入的支持不同
  • 查找顺序不同
  • 支持参数不同

1. 来源不同

@Resource位于包javax.annotation,是JDK原生的注解;

@Autowired位于包org.springframework.beans.factory.annotation
,是Spring2.5 之后引入的注解。

2. 对Constructor注入的支持不同

由于构造方法在对象创建的时候调用,执行的时期较早,由于jdk将@Resource的执行时期设计晚于构造方法调用的时期,因此在构造方法上使用@Resource注解编译器会报错:

image.png

3. 查找顺序不同

3.1 Bean在Spring中的存储方式

Bean在Spring中的存储方式是类似于Java中的HashMap的。

一个Bean对象有它的NameType,分别对应着xml文件中配置的Bean的idclass

也就是说通过同一个类可以创建两个id不同的Bean对象:

<bean id="user1" class="UserBean"></bean>
<bean id="user2" class="UserBean"></bean>

通过Java的数据结构HashMap<key, value>,我们可以通过key(键)找到对应的value(值),而Bean的Name+Type,就对应着key,而Bean对象就对应着value

3.2 @Autowired查找顺序

下面的代码中,DemoDao对应着TypedemoDao对应着Name

@Autowired
private DemoDao demoDao;

@Autowired是先通过Type查找,如果一个Type对应多个Bean,它才会去通过Name查找,如果找不到唯一的Name,那么就会抛出异常。

实验验证:

第一次,只有DemoDaoImpl实现DemoDao接口,UserService的代码如下,只有Bean的Type能匹配上,而Name无法匹配上:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

成功找到Bean并运行:

select * from demo
Do User Service
Do User Controller.

第二次,我让DemoDaoImplUserDaoImpl都实现DemoDao接口:

@Repository
public class DemoDaoImpl implements DemoDao {

    @Override
    public void selectAll() {
        System.out.println("select * from demo");
    }
}
@Repository
public class UserDaoImpl implements DemoDao {
    @Override
    public void selectAll() {
        System.out.println("select * from user");
    }
}

运行程序发现报了一个没有唯一定义的Bean的异常:

NoUniqueBeanDefinitionException: No qualifying bean of type 'com.chenshu.dao.DemoDao' available: 

第三次,我同样让DemoDaoImplUserDaoImpl都实现DemoDao接口,并且让UserService中的NameDemoDaoImpl匹配上:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDaoImpl;

    public void doService() {
        demoDaoImpl.selectAll();
        System.out.println("Do User Service");
    }
}

这次又能正常注入Bean,并成功调用Bean的方法:

select * from demo
Do User Service
Do User Controller.

上面的结论足以验证@Autowired的查找顺序是先通过Type查找再通过Name查找。

3.3 @Resource查找顺序

这里我直接给出结论:@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找。

4. 支持参数不同

点开@Resource注解并查看它的Structure:
image.png

点开@Autowired注解并查看它的Structure:
image.png

对比二者,@Resource注解提供了更丰富的参数

4.1 引入需求

UserService代码如下:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

此时有UserDaoImplDemoDaoImpl实现DemoDao接口,现在我想在不改变参数名的情况下,解决一个类对应两个Bean对象的问题

4.2 解决方案

方案一:通过@Resource注解

@Resource注解提供了一个name参数,通过该参数可以指定通过该参数的值来查找Bean:

@Service
public class UserService {
    @Resource(name = "userDaoImpl")
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

方案二:通过@Autowired注解

虽说@Resource能够通过参数便利地解决问题,但它还是有个硬伤:无法实现构造器注入。

@Autowired没有提供相应的参数实现该需求,但是我们可以通过额外的@Qualifier注解来实现:

@Service
public class UserService {
    @Autowired
    @Qualifier(value = "userDaoImpl")
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}
```在上一节我们使用Autowired进行了bean的装配,@Autowired@Resource都可以用来装配bean,但它们之前还是有一些区别,它们的区别具体体现为以下几点:
- 来源不同
-Constructor注入的支持不同
- 查找顺序不同
- 支持参数不同


# 1. 来源不同
`@Resource`位于包`javax.annotation`,是JDK原生的注解;

而`@Autowired`位于包`org.springframework.beans.factory.annotation`
,是Spring2.5 之后引入的注解。
# 2.Constructor注入的支持不同
由于构造方法在对象创建的时候调用,执行的时期较早,由于jdk将@Resource的执行时期设计晚于构造方法调用的时期,因此在构造方法上使用@Resource注解编译器会报错:

![image.png](https://p6-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/a2c31913d1d74067862b301fca4dbd44~tplv-k3u1fbpfcp-jj-mark:0:0:0:0:q75.image#?w=382&h=87&s=11624&e=png&b=1c1c1f)
# 3. 查找顺序不同
## 3.1 BeanSpring中的存储方式
BeanSpring中的存储方式是类似于Java中的`HashMap`的。

一个Bean对象有它的`Name`和`Type`,分别对应着xml文件中配置的Bean的`id`和`class`

也就是说通过同一个类可以创建两个`id`不同的Bean对象:
```xml
<bean id="user1" class="UserBean"></bean>
<bean id="user2" class="UserBean"></bean>

通过Java的数据结构HashMap<key, value>,我们可以通过key(键)找到对应的value(值),而Bean的Name+Type,就对应着key,而Bean对象就对应着value

3.2 @Autowired查找顺序

下面的代码中,DemoDao对应着TypedemoDao对应着Name

@Autowired
private DemoDao demoDao;

@Autowired是先通过Type查找,如果一个Type对应多个Bean,它才会去通过Name查找,如果找不到唯一的Name,那么就会抛出异常。

实验验证:

第一次,只有DemoDaoImpl实现DemoDao接口,UserService的代码如下,只有Bean的Type能匹配上,而Name无法匹配上:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

成功找到Bean并运行:

select * from demo
Do User Service
Do User Controller.

第二次,我让DemoDaoImplUserDaoImpl都实现DemoDao接口:

@Repository
public class DemoDaoImpl implements DemoDao {

    @Override
    public void selectAll() {
        System.out.println("select * from demo");
    }
}
@Repository
public class UserDaoImpl implements DemoDao {
    @Override
    public void selectAll() {
        System.out.println("select * from user");
    }
}

运行程序发现报了一个没有唯一定义的Bean的异常:

NoUniqueBeanDefinitionException: No qualifying bean of type 'com.chenshu.dao.DemoDao' available: 

第三次,我同样让DemoDaoImplUserDaoImpl都实现DemoDao接口,并且让UserService中的NameDemoDaoImpl匹配上:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDaoImpl;

    public void doService() {
        demoDaoImpl.selectAll();
        System.out.println("Do User Service");
    }
}

这次又能正常注入Bean,并成功调用Bean的方法:

select * from demo
Do User Service
Do User Controller.

上面的结论足以验证@Autowired的查找顺序是先通过Type查找再通过Name查找。

3.3 @Resource查找顺序

这里我直接给出结论:@Resource 是先根据名称查找,如果(根据名称)查找不到,再根据类型进行查找。

4. 支持参数不同

点开@Resource注解并查看它的Structure:
image.png

点开@Autowired注解并查看它的Structure:
image.png

对比二者,@Resource注解提供了更丰富的参数

4.1 引入需求

UserService代码如下:

@Service
public class UserService {
    @Autowired
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

此时有UserDaoImplDemoDaoImpl实现DemoDao接口,现在我想在不改变参数名的情况下,解决一个类对应两个Bean对象的问题

4.2 解决方案

方案一:通过@Resource注解

@Resource注解提供了一个name参数,通过该参数可以指定通过该参数的值来查找Bean:

@Service
public class UserService {
    @Resource(name = "userDaoImpl")
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

方案二:通过@Autowired注解

虽说@Resource能够通过参数便利地解决问题,但它还是有个硬伤:无法实现构造器注入。

@Autowired没有提供相应的参数实现该需求,但是我们可以通过额外的@Qualifier注解来实现:

@Service
public class UserService {
    @Autowired
    @Qualifier(value = "userDaoImpl")
    private DemoDao demoDao;

    public void doService() {
        demoDao.selectAll();
        System.out.println("Do User Service");
    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

事务隔离级别(图文详解)

事务隔离级别(图文详解) 什么是事务? 事务是逻辑上的一组操作&#xff0c;要么都执行&#xff0c;要么都不执行。 事务最经典也经常被拿出来说例子就是转账了。假如小明要给小红转账1000元&#xff0c;这个转账会涉及到两个关键操作就是&#xff1a;将小明的余额减少1000元…

Chatgpt掘金之旅—有爱AI商业实战篇|SEO 咨询业务|(十七)

演示站点&#xff1a; https://ai.uaai.cn 对话模块 官方论坛&#xff1a; www.jingyuai.com 京娱AI 一、AI技术创业在SEO 咨询业务有哪些机会&#xff1f; 人工智能&#xff08;AI&#xff09;技术作为当今科技创新的前沿领域&#xff0c;为创业者提供了广阔的机会和挑战。随…

触发 hover 效果时,设置文字底部横杠显示

需求描述 需要在鼠标悬停时显示文字效果及下面出现一个横条&#xff0c;如图 <!-- 页面结构 --> <nav><ul><li>精选</li><li>女装</li><li>男装</li><li>彩妆</li><li>运动</li><li>家…

本科大学生计算机毕业设计案例:遗失物品信息管理系统

设计需求&#xff1a; 客户需求&#xff1a; 项目所用技术&#xff1a; 后端&#xff1a;springBoot,mybatisPlus,springSecurity,Swagger2 前端&#xff1a;vue-element-admin,elementUi 数据库&#xff1a;mysql&#xff0c;redis 数据库表设计&#xff1a; 关键代码展示&a…

Springboot+Vue项目-基于Java+MySQL的在线视频教育平台系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

linux学习:标准IO

目录 接口 打开文件 关闭文件 读写 每次一个字符的读写标准 IO 函数接口 每次一行的读写标准 IO 函数接口 每次读写若干数据块的标准 IO 函数接口 获取或设置文件当前位置偏移量 标准格式化 IO 函数 系统 IO 的最大特点一个是更具通用性&#xff0c;不管是普通文件、管…

障碍物识别技术赋能盲人独立出行:一场静默的科技革新

作为一名资深记者&#xff0c;我始终关注并报道那些科技如何助力特殊群体克服生活挑战的动人故事。近期&#xff0c;一款叫做蝙蝠避障的应用进入了我的视线&#xff0c;它搭载先进障碍物识别技术以其独特的优势&#xff0c;悄然为视障人士的独立出行带来了显著变革。 “障碍物识…

asm磁盘组无法写入问题-处理中

有个11204的rac环境&#xff0c;没应用补丁&#xff0c;5号突然报归档满&#xff0c;登录环境后发现奇怪&#xff0c;一个1T磁盘建成的DATA磁盘组使用了近800G&#xff0c;读写正常&#xff0c;一个1.5T磁盘建成的FRA磁盘组&#xff0c;目前还剩余729551M&#xff0c;无法写入归…

AutoCAD之DWF三维信息提取---linux编译篇

1. 权限 1.1 给文件添加执行权限 chmod x autogen.sh1.2.给当前文件下的所有文件改变为读写执行权限 chmod 777 * -R 2.环境安装 2.1安装automake 1.4.1 安装链接 安装中遇到的问题及解决 2.2安装autoconf 2.3 安装libtool 2.4 安装Cmake(CMake包含) cmake安装在cent…

STM32—DMA直接存储器访问详解

DMA——直接存储器访问 DMA&#xff1a;Data Memory Access, 直接存储器访问。 DMA和我们之前学过的串口、GPIO都是类似的&#xff0c;都是STM32中的一个外设。串口是用来发送通信数据的&#xff0c;而DMA则是用来把数据从一个地方搬到另一个地方&#xff0c;而且不占用CPU。…

windows本地运行dreamtalk踩坑总结

dreamtalk是一个语音图片转视频的一个工具&#xff0c;就是给一段语音加一个头像图片&#xff0c;然后生成一段头像跟语音对口型的视频&#xff0c;其实还是很有意思的&#xff0c;最近阿里发布了一个类似的模型&#xff0c;但是还没开源&#xff0c;从展示视频看&#xff0c;阿…

酷开科技OTT大屏营销:开启新时代的营销革命

随着互联网技术的不断发展和普及&#xff0c;大屏已经成为越来越多家庭选择的娱乐方式。在这个背景下&#xff0c;酷开科技凭借其强大的技术实力和敏锐的市场洞察力&#xff0c;成功地将大屏转化为一种新的营销渠道&#xff0c;为品牌和企业带来了前所未有的商业机会。 酷开科技…

WEB3.0:互联网的下一阶段

随着互联网的发展&#xff0c;WEB3.0时代正在逐步到来。本文将深入探讨WEB3.0的定义、特点、技术应用以及未来展望&#xff0c;为读者带来全新的思考。 一、什么是WEB3.0&#xff1f; WEB3.0可以被理解为互联网发展的下一阶段&#xff0c;是当前WEB2.0的升级版。相较于2.0时代…

CentOS 各个版本下载地址

https://mirror.nsc.liu.se/centos-store/7.6.1810/isos/x86_64/ CentOS-7-x86_64-DVD-1810.iso 2018-Nov-26 00:55:20 4.2G application/octet-stream 正常版 CentOS-7-x86_64-DVD-1810.torrent 2018-Dec-03 16:03:27 85.9K application/x-bittorrent CentOS-7-x86_64-Every…

用户系统加密--Java

一个基本的用户系统如下&#xff1a; # 定义用户类 class User:def __init__(self, name, password):self.name nameself.password password# 创建用户列表 users []# 添加新用户 def add_user(name, password):new_user User(name, password)users.append(new_user)print…

洛谷-P1596 [USACO10OCT] Lake Counting S

P1596 [USACO10OCT] Lake Counting S - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) #include<bits/stdc.h> using namespace std; const int N110; int m,n; char g[N][N]; bool st[N][N]; //走/没走 int dx[] {-1,-1,-1,0,0,1,1,1}; //八联通 int dy[] {-1,0,1,1,-1,1…

LDF、DBC、BIN、HEX、S19、BLF、ARXML、slx等

文章目录 如题 如题 LDF是LIN报文格式文件&#xff0c;把这个直接拖到软件里面&#xff0c;可以发报文和接收报文 DBC是CAN报文格式文件&#xff0c;把这个直接拖到软件里面&#xff0c;可以发报文和接收报文 BIN文件烧录在BOOT里面&#xff08;stm32&#xff09;&#xff0c…

【前端】解决前端图表大数据配色难题:利用HSL动态生成颜色方案

解决前端图表大数据配色难题&#xff1a;利用HSL动态生成颜色方案 在数据可视化项目中&#xff0c;尤其是当需要绘制包含大量数据点的图表时&#xff0c;一个常见的挑战是如何为每个数据点分配一个独特而又视觉上容易区分的颜色。使用固定的颜色列表可能在数据点数量超过列表限…

CTF-SHOW SSRF

web351 存在一个flag.php页面&#xff0c;访问会返回不是本地用户的消息&#xff0c;那肯定是要让我们以本地用户去访问127.0.0.1/flag.php web352 代码中先判断是否为HTTP或https协议&#xff0c;之后判断我们传入的url中是否含有localhost和127.0.0&#xff0c;如果没有则…

课时93:流程控制_函数进阶_综合练习

1.1.3 综合练习 学习目标 这一节&#xff0c;我们从 案例解读、脚本实践、小结 三个方面来学习。 案例解读 案例需求 使用shell脚本绘制一个杨辉三角案例解读 1、每行数字左右对称&#xff0c;从1开始变大&#xff0c;然后变小为1。    2、第n行的数字个数为n个&#xf…