CTO 说了,不懂 @Autowired 和 @Resource 区别的人可以领盒饭了

简介: @Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。
  • 1、共同点
  • 2、不同点

@Resource和@Autowired都是做bean的注入时使用,其实@Resource并不是Spring的注解,它的包是javax.annotation.Resource,需要导入,但是Spring支持该注解的注入。

先上图:

1.png

1、共同点

两者都可以写在字段和setter方法上。两者如果都写在字段上,那么就不需要再写setter方法。

基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能。

项目地址:https://github.com/YunaiV/ruoyi-vue-pro

2、不同点

(1)@Autowired

@Autowired为Spring提供的注解,需要导入包org.springframework.beans.factory.annotation.Autowired;只按照byType注入。

public class TestServiceImpl {
   // 下面两种@Autowired只要使用一种即可
   @Autowired
   private UserDao userDao; // 用于字段上
   @Autowired
   public void setUserDao(UserDao userDao) {
   // 用于属性的方法上
       this.userDao = userDao;
   }
}

@Autowired注解是按照类型(byType)装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它的required属性为false。如果我们想使用按照名称(byName)来装配,可以结合@Qualifier注解一起使用。如下:

public class TestServiceImpl {
   @Autowired
   @Qualifier("userDao")
   private UserDao userDao;
}

注意:

经常可以在IDEA中看到关于@Autowired注解的黄牌警告,如下:

@Autowire
private JdbcTemplate jdbcTemplate;

提示的警告信息

Field injection is not recommended Inspection info: Spring Team recommends: "Always use constructor based dependency injection in your beans. Always use assertions for mandatory dependencies".

这段是Spring工作组的建议,大致翻译一下:

属性字段注入的方式不推荐,检查到的问题是:Spring团队建议:"始终在bean中使用基于构造函数的依赖项注入,始终对强制性依赖项使用断言"

1.png

原因大家知道了吧?

(2)@Resource

@Resource 是JDK1.6支持的注解,由J2EE提供,需要导入包javax.annotation.Resource。默认按照名称进行装配,名称可以通过name属性进行指定。也提供按照byType 注入。

@Resource有两个重要的属性:name 和 type,而Spring将@Resource注解的name属性解析为bean的名字,而type属性则解析为bean的类型。

@Resource(name = "userDaoImpl2",type = UserDaoImpl.class)
    private UserDao userDao;

如果没有指定name属性,当注解写在字段上时,默认取字段名,按照名称查找。

当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

当找不到与名称匹配的bean时才按照类型进行装配。但是需要注意的是,如果name属性一旦指定,就只会按照名称进行装配。

示例:

public class TestServiceImpl {
    // 下面两种@Resource只要使用一种即可
    @Resource(name="userDao")
    private UserDao userDao; // 用于字段上
    @Resource(name="userDao")
    public void setUserDao(UserDao userDao) { // 用于属性的setter方法上
        this.userDao = userDao;
    }
}

注:最好是将@Resource放在setter方法上,因为这样更符合面向对象的思想,通过set、get去操作属性,而不是直接去操作属性。

@Resource装配顺序:

①如果同时指定了name和type,则从Spring上下文中找到唯一匹配的bean进行装配,找不到则抛出异常。

②如果指定了name,则从上下文中查找名称(id)匹配的bean进行装配,找不到则抛出异常。

③如果指定了type,则从上下文中找到类似匹配的唯一bean进行装配,找不到或是找到多个,都会抛出异常。

④如果既没有指定name,又没有指定type,则自动按照byName方式进行装配;如果没有匹配,则回退为一个原始类型进行匹配,如果匹配则自动装配。

@Resource的作用相当于@Autowired,只不过@Autowired按照byType自动注入。

相关文章
|
安全 Shell Linux
【Shell 命令集合 系统管理 】Linux 切换当前用户身份为另一个用户 su命令 使用指南
【Shell 命令集合 系统管理 】Linux 切换当前用户身份为另一个用户 su命令 使用指南
1232 1
|
7月前
|
机器学习/深度学习 JSON 文字识别
还在研究部署PaddleOCR?数眼智能OCR文档解析API上线:免费使用!
数眼智能推出新一代OCR文档解析API,突破传统OCR局限,融合多模态识别与深度学习,精准还原PDF、扫描件中的文字、表格、公式等结构,直接输出带层级的Markdown与JSON数据。实现标题、段落、表格自动分离,助力大模型知识库构建、金融报表分析、学术文献处理等场景,10秒内高效响应,让纸质文档秒变智能数据资产。
495 1
|
XML 数据格式
美团抢单辅助器app,美团众包抢单辅助脚本,骑手自动抢高价单插件
这是一段关于美团骑手抢单辅助脚本的介绍。使用该脚本可设置最高与最低价格、延迟时间等参数,通过自动化检测和抢单功能帮助骑手提高收入。
|
存储 SQL 安全
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享
随着互联网的普及,网络安全问题日益突出。本文将介绍网络安全的重要性,分析常见的网络安全漏洞及其危害,探讨加密技术在保障网络安全中的作用,并强调提高安全意识的必要性。通过本文的学习,读者将了解网络安全的基本概念和应对策略,提升个人和组织的网络安全防护能力。
|
Web App开发 前端开发 Java
解决新版chrome跨域问题:cookie丢失以及samesite属性问题
解决新版chrome跨域问题:cookie丢失以及samesite属性问题
2099 0
解决新版chrome跨域问题:cookie丢失以及samesite属性问题
|
存储 监控 安全
ARM系列 -- 虚拟化(二)
ARM系列 -- 虚拟化(二)
468 0
|
XML JSON 程序员
程序员必知:常用天气预报API接口整理(转)
程序员必知:常用天气预报API接口整理(转)
741 0
|
存储 IDE Java
程序员基本功,为什么你一定要懂16进制?
其实计算机需要的只是二进制,需要十六进制的是我们人
3707 1
程序员基本功,为什么你一定要懂16进制?
|
安全 芯片
平芯微FP6601Q:QC3.0快充识别芯片,智能充电新选择
FP6601Q是一款高性能的充电管理芯片,具备出色的智能识别功能。它能够自动识别接入的充电设备,支持多种快充协议,包括BC1.2、Apple、Samsung AFC、华为FCP/SCP、Class A、QC3.0和QC2.0等。这使得FP6601Q能够广泛兼容苹果、三星、华为等主流设备,实现快速充电。同时,它还支持高通骁龙平台设备的QC3.0、QC2.0 Class A快速充电,为用户提供了更加便捷和高效的充电体验。
|
物联网 5G 定位技术
蜂窝无线网络技术及常用场景(一)
蜂窝无线网络技术及常用场景(一)
1651 0