【springboot】你了解@Autowired 和 @Resource吗?@Autowired 和 @Resource深入分析

news2024/11/25 6:33:41

@Autowired 和 @Resource深入分析

  • “认祖归宗”--@Autowired 和 @Resource来源
  • “通过现象看本质”--@Autowired 和 @Resource作用和区别
    • 1.现象一:一个业务接口只对应一个业务实现类
    • 2.现象二:一个业务接口 对应 两个或多个业务实现类

我们在开发中,一直用到的都是@Autowired,那么为什么这么用有没有想过?还有@Resource也可以作为注入的注解,为什么又不用?

“认祖归宗”–@Autowired 和 @Resource来源

那么首先,我们得知道这两个注解,他们是来自于哪?
@Autowired

package org.springframework.beans.factory.annotation;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired {
    boolean required() default true;
}

我们可以看到,它是package org.springframework.beans.factory.annotation;是一个 spring 的注解 ;

@Resource

package javax.annotation;

import java.lang.annotation.*;
import static java.lang.annotation.ElementType.*;
import static java.lang.annotation.RetentionPolicy.*;

@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource {

我们可以看到它是package javax.annotation;, 是一个J2EE (java自己)的注解。

总结

@Autowired 是一个 spring 的注解
@Resource 是一个J2EE (java自己)的注解

“通过现象看本质”–@Autowired 和 @Resource作用和区别

1.现象一:一个业务接口只对应一个业务实现类

UserService接口:

public interface User Service{
 public void test();
}

接口的实现类UserServiceImpl:

@Service
public class UserServieImpl implements UserService{
@Override
public void test()[
	System.out.print("test");
}

接下来我们给UserController里注入属性UserService
分别使用@Autorwired以及@Resource

...
@Autowired
private UserService userService;
...
...
@Resource
private UserService userService;
...

运行测试,结果都可以正常输出!

难道这么说它们两个随便用??

2.现象二:一个业务接口 对应 两个或多个业务实现类

我们加上一个UserServiceImpl2实现类:

@Service
public class UserServieImpl2 implements UserService{
@Override
public void test()[
   System.out.print("test");
}

现在,UserService接口有两个实现类,UserServiceImpl、UserServiceImpl2.

继续!!!

我们先使用@Autorwired注入!

...
@Autowired
private UserService userService;
...

运行结果!出错!

在这里插入图片描述

报错信息显示:

  1. 告诉我们 ,在MyTestController里面, 需要注入一个UserService (实现类), 但是却发现了两个这种类型的bean。

  2. 提供解决思路, 告诉我们可以使用@Primay注解 告诉哪一个是优先注入的,或者 使用@Qualifier 指定一下 需要注入哪个。

原因:

     @Autowired 是根据 类型 (byType)注入的 ,然后在找到type类型的bean时,如果发现有异常(不唯一等),会再去根据name去找bean注入。
    因为两个实现类bean都实现了UserService ,那肯定找到两个了,也就是有异常了,然后name我们写的是userService(实际两个业务实现类我们用@Service丢到spring容器里面默认名字是首字母小写userServiceImpl,userServiceImpl2),根本没有userService这个Bean。

异常处理

我们常配合 @Qualifier 注解去使用 ,指定一下 根据指定别名去注入。

@Service("userService")
public class UserServieImpl implements UserService{
@Override
public void test()[
	System.out.print("test");
}

...
@Autowired
@Qualifier("userService")
private UserService userService;
...

这样就可以解决 一个业务接口 对应 两个或多个业务实现类 的场景!!

总结

@Autowired 是根据 类型 (byType)注入的 , 然后当找到type类型的bean时,如果发现有异常(不唯一等),会再去根据name去找bean注入。


接下来,我们换成@Resource注解!

结果是:如同上面报错信息,也提示错误!

原因

@Resource 默认是 根据 名字(byName)注入的 。

而且 @Resource 其实提供了 name 和 type 属性值设置。
但是如果使用的时候,跟上文一样啥都没有指定,那么就是先byName 默认方式去找(userService):

  • 发现根本没有这个userService, 因为我们 注入到bean容器里面 是 这两个玩意(@Servcie):userServiceImpl、userServiceimpl2!

  • 而且咱们使用@Servcie 注入这俩玩意没有起别名,那么就是默认 首字母变小写 当做注入的bean名字。

  1. 那么 @Resource ,它根据可靠信息 name 名称 ( userService ),找不到bean;
  2. 那么就会根据 type 类型 (UserService) 去spring容器里面找找,有没有这种类型的bean;
    结果发现了 两个类型都是 UserService 的 两个倒霉孩子 userServiceImpl,userServiceImpl2 ;

所以就报错!!!

异常处理

@Resource 人家默认 byName 去找bean ,然后还提供name 和type 一起设置或者单一设置。
也就是说,这个@Resource 已经做得很到位了。

    简单解决,设置名字咯,刚刚说了 我们使用@Service 注入实现类bean的时候,没有特意指定名称,那么就是首字母小写当做了bean的名称,所以我们使用@Resource 也指定设置一下name:

...
@Resource(name = "userService")
private UserService userService;
...

这样一来,就解决了@Resource的这种bean冲突问题!

总结

@Resource 默认是根据 ByName注入的 , 然后如果发现有异常(不唯一等),会再去根据type去找bean注入。同时,提供了name、type两个属性可以进行指定name或者type

至此,这两个注解用法大家应该有所感受了吧!

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

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

相关文章

【数据结构】链表其实并不难 —— 手把手带你实现双向链表

文章目录0. 前言1. 双向链表的概念2. 双向链表的实现2.1 结构设计2.2 接口总览2.3 初始化2.4 创建新节点2.5 尾插2.6 头插2.7 尾删2.8 头删2.9 查找2.10 在pos位置之前插入2.11 在pos位置删除2.12 打印2.13 销毁3. 完整代码List.hList.ctest.c4. 结语0. 前言 之前,…

【Python百日进阶-WEB开发】Day175 - Django案例:07状态保持

文章目录五、状态保持5.1 Django中状态保持5.1.1 状态保持概述5.1.2 Cookie5.1.2.1 Cookie的用处:5.1.2.1 Cookie的特点:5.1.2.1 Cookie的操作:5.1.3 session5.1.3.1 Session的特点:5.1.3.2 Session依赖于Cookie5.1.3.3 存储方式5…

网页数据抓取-网页实时数据抓取软件

网页数据抓取,随着社会的发展,互联网的普及,不管是企业还是个人都意识到数据的重要性。今天给大家分享一款免费的网页数据抓取软件。只要点点鼠标就能轻松采集你想要的内容不管是导出还是自动发布都支持!详细参考图片!…

Qlib股票数据获取与查看(Qlib学习1)

文章目录Qlib基本信息数据使用方法1. 借助Qlib下载数据2. 查看相关数据参考链接Qlib基本信息 Qlib Github主页:https://github.com/microsoft/qlib Qlib quickstart:https://qlib.readthedocs.io/en/latest/introduction/quick.html#introduction 基本…

LeetCode刷题---142. 环形链表 II(双指针-快慢指针)

文章目录一、编程题:142. 环形链表 II(双指针-快慢指针)1.题目描述2.示例1:3.示例2:4.示例3:5.提示:6.提示:二、解题思路1.思路2.复杂度分析:3.算法图解三、代码实现总结…

如何理解Linux下一切皆文件

文章目录一、问题抛出二、如何理解三、Linux源码验证一、问题抛出 Linux中普通文件、目录、字符设备、块设备、网络设备等都被当做文件来对待。虽然他们的类型不同,但是Linux中提供了统一的操作接口。  普通文件、目录文件显然非常好理解,因此在本文中&…

今日论文阅读2022-11-10

多模态预训练论文ViLBERT: Pretraining Task-Agnostic Visiolinguistic Representations for Vision-and-Language Tasksvision-and-language tasks: visual question answering,visual commonsense reasoning, referring expressions, and caption-based image ret…

基于DeepLabV3实践路面、桥梁、基建裂缝裂痕分割

在我前面的文章中有基于改进的模型开发的裂缝裂痕检测模型,感兴趣的话可以看下: 《基于yolov5sbifpn实践隧道裂缝裂痕检测》 今天主要是趁着有时间基于deeplabv3来实践裂缝裂痕分割。首先来看效果图: 为了整体直观,这里专门是开…

腾讯蓝鲸 API 网关如何借助 APISIX 实现产品升级与业务完善

分享嘉宾朱雷,腾讯 IEG 运维 PaaS 平台技术负责人。 蓝鲸(全名“蓝鲸智云”)是一套孵化于腾讯 IEG(互动娱乐事业群)内部,服务于多业务与各内部平台的研运一体化 PaaS。 其作用是在 CI、CD 和 CO 三个阶段&a…

Spring 概述

Spring是 Java 应用程序开发框架。 Spring 框架的目标是使 J2EE 开发变得更容易使用,通过启用基于 POJO编程模型来促进良好的编程实践。 Spring Framework Spring 基础框架是 Spring Framework ,基本上任何其他 Spring 项目都是以 Spring Framework 为…

如何进入 mysql?

目录 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t 4. 点回车出现 下面的 就代表已经进入 mysql 退出 mysql的 方法: 1. win r 2. 输入cmd点确定 3. 输入 mysql -u -t -u :代表你的用户名,如果是本地登录 则为 -uroot-p &am…

学习python第7天

Python绘制图形库turtle 1.介绍: turtle库根据一组函数指令的控制,在平面坐标系中移动,从 而它爬行的路径上绘制图形。 2.原理:turtle(海龟)由程序控制在画布上游走,走过的轨迹形成绘 制的图形&#xff0c…

子不语IPO下限定价:预计2022年全年净利润下滑,华丙如为实控人

11月10日,子不语集团有限公司(HK:02420,下称“子不语”)在港交所公布发售结果。公告显示,子不语在香港公开发售及国际配售(不含基石部分)阶段均获得超额认购,将于2022年11月11日在港…

【前端】Vue+Element UI案例:通用后台管理系统-登陆页面Login

文章目录目标代码0.路由1.结构2.校验规则3.样式总代码Login.vue效果本篇很短,因为只有一个页面。没有功能。 目标 登陆页面,路由为/login有表单验证 代码 0.路由 在router的index.js文件中的routes中添加对象: {path:/login,component:L…

SpringBoot+Mybatis+CRUD项目

一、项目要求 创建一个 SpringBoot 项目,项目名”week11_学号”;使用 Mybatis 框架,也可以时可用 MybatisPlus 框架;访问 myschool 数据库;对 student 表进行操作,向 student 插入自己的一条记录&#xff…

Linux学习-29-用户组信息相关命令

8.17 Linux groupadd命令:添加用户组 添加用户组的命令是 groupadd,命令格式如下: [rootCncLucZK ~]# groupadd [选项] 组名选项: -g GID:指定组 ID;-r:创建系统群组。-o 一般与-g选项同时使用&#xff0…

C++ opencv 图像色彩空间转换--色域捕获

1.API和相关知识 1.inRange 在opencv中,我们提取指定色彩范围的区域,采用inRange实现,这样的一块区域,学名叫做ROI(region of interest),感兴趣区域。 关于inRange的提取原理 图像中&#xff0…

这是一篇用python画3D爱心的代码

浅浅写一个最近很火的爱心代码 最近你是否也被李峋的爱心跳动代码所感动,心动不如行动,相同的代码很多,我们今天换一个玩法!构建一个三维的跳动爱心!嗯!这篇博客本着开源的思想!不是说谁对浪漫…

开放服务担心安全?vx-api-gateway值得一用

下载地址:VX-API-Gateway帮助文档 下载解压打开后 Windows 下vx-api-gateway启动 bin目录下start.bat文件 启动后访问http://localhost:5256/ VX-API客户端用于查看VX-API运行的基本信息,管理应用与API及黑名单,打开客户端的方式,在浏览器中请求http://地址:端口…

被生活、房贷车贷压得喘不过气的35岁测试工程师,拿什么来谈追求~

高龄测试员现状 我有位在深圳工作的测试员朋友分享了他的工作经历,他今年35岁,前不久被公司辞退,面对家庭,房贷,车贷的压力,让他的生活都是一片灰,离职后最让测试员感到痛心是在面试多家公司以…