浅谈Spring框架中@Autowired和@Resource的区别
作者:阿杆 发布时间:2023-11-26 11:31:21
前言
写过Spring框架的同学应该都知道,Spring当中使用字段注入的时候既可以用 @Autowired
又可以用 @Resource
,但是当我使用 @Autowired
,idea会提示我说,不建议使用字段注入:
但如果我用的是 @Resource
,就不会有这样的提示:
于是在好奇心的驱使下,我探究了一下他们两者的区别,并了解了为什么idea会对 @Autowired
发出弱警告,在这里分享给大家。
默认注入方式不同
@Autowired
默认的注入方式为byType(根据类型进行匹配),也就是说会优先根据接口类型去匹配并注入 Bean (接口的实现类),如果想要指定名称,可以通过@Qualifier
配合使用。@Autowired
private UserSafetyMapper userSafetyMapper;
// 或
@Autowired @Qualifier("userSafetyMapper")
private UserSafetyMapper userSafetyMapper;@Resource
默认注入方式为 byName(根据命名进行匹配)。如果无法通过名称匹配到对应的实现类的话,注入方式会变为byType。// 1.默认注入方式
@Resource
private UserSafetyMapper userSafetyMapper;
// 2.指定注入方式
@Resource(name = "userSafetyMapper", type = UserSafetyMapper.class)
private UserSafetyMapper userSafetyMapper;如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常;
如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常;
如果指定了type,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常;
如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。
提供者不同
@Autowired
是spring提供的注解,@Resource
是JDK提供的注解。其实这也是为什么idea会对 @Autowired
发出警告,而不会对@Resource
发出警告的原因。
根据我查阅的一些资源和一点个人理解,得出以下分析:
@Autowired
是Spring提供的,它只能适用于Spring,是特定IOC提供的特定注解,这就导致了程序和框架的强耦合,一旦换用了其他的IOC框架,就会导致失效,无法支持注入。而 @Resource
是Java提供的一种标准,一般的IOC容器应该去主动对 @Resource
做兼容,这样我们即使换了其他的框架,也可以正常使用字段注入的功能。
不过话又说回来,我们在搭建一个项目的时候,刚开始选好框架了,以后很大可能就不会再去更换为其他的框架了,即使字段注入松耦合了,但其实还有其他更多的东西需要去修改,所以我个人认为用这两个都可以,具体使用哪个还得看公司的编码规范,个人项目的话,统一使用一个就好了。
补充:@Resource的装配顺序如下
如果同时指定了name和type,流程如下:
如果指定了name,流程如下:
只是指定了@Resource注解的name,则按name后的名字去bean元素里查找有与之相等的name属性的bean。
如果指定了type,流程如下:
只指定@Resource注解的type属性,则从上下文中找到类型匹配的唯一bean进行装配,找不到或者找到多个,都会抛出异常。
如果既没有指定name,也没有指定type,流程如下:
既不指定name属性,也不指定type属性,则自动按byName方式进行查找。如果没有找到符合的bean,则回退为一个原始类型进行进行查找,如果找到就注入。
来源:https://juejin.cn/post/7159552805479383054
猜你喜欢
- File类概述File类是java.io包下代表与平台无关的文件和目录。File可以新建、删除、重命名文件和目录,但是不能访问文件内容本身,
- 1、来源random.nextInt() 为 java.util.Random类中的方法; Math.random() 为 java.lan
- 让我们来看看这段代码: import java.util.BitSet;import java.util.concurrent.C
- 前言之前做的几个微信小程序项目,大部分客户都有要在微信小程序前端提现的需求。提现功能的实现,自然使用企业付款接口,不过这个功能开通比较麻烦,
- ID说明 设备唯一标识符(UDID):设备唯一硬件标识,设备生产时根据特定的硬件信息生成,可用于设备的生产环境及合法性校验。不对第
- 一、直接执行SQL查询:1、mappers文件节选<resultMap id="AcModelResultMap"
- 本文介绍idea的安装和基本使用首先保证JDK正常安装及配置下载地址:https://www.jetbrains.com/idea/down
- java.sql.Timestamp(时间戳)继承父类:java.util.Date所有已实现的接口:Serializable, Clone
- 出于安全考虑,在后台与前台进行数据传输时,往往不会直接传输实体模型,而是使用Dto(Data transfer object 数据传输对象)
- 1、在设计初期阶段,应该要有意识的将不同的两层分离,比如考虑数据访问层、业务逻辑层、表示层之间建立外观模式,这样可以为子系统提供简单一致的接
- 方式一:if语句控制// 例如:Column( mainAxisAlig
- 本地仓库主要是一种缓存,当你使用远程仓库中下载组件后,它下一次会优先从本地进行加载,一般位于USER_HOME/.m2目录下,我们自己也可以
- java金钱处理方法实例详解在支付行业中,涉及到对金钱的处理比较多。比如分转化成元、费率计算、手续费计算等等。1.分转化成元/** &nb
- 目录前沿快速开始引入依赖定义接口配置类开始调用json序列化接口层面指定header:指定Encoder跟Decoder使用 * 注解详解@
- mybatis insert foreach循环插入@Insert("<script>" +
- 1、这个方法在GpsNET.JT809Core里来源:https://www.cnblogs.com/cnsend/p/12197982.h
- 一、背景1.1 应用系统的架构历史1.2 什么是微服务?起源:微服务的概念源于 2014 年 3 月 Martin Fowler 所写的一篇
- feignclient https接口调用报证书错误问题最近在使用 feignclient 过程中,和第三方通过https 协议交互的时候,
- springboot动态调用实现类定义规则的多种类型/** * 数据规则处理类型枚举 */public enum RuleType { &n
- 本文实例讲述了C#数据结构之堆栈(Stack)。分享给大家供大家参考,具体如下:堆栈(Stack)最明显的特征就是“先进后出”,本质上讲堆栈