【后端】Spring @Resource和@Autowired的用法和区别

以下是关于 @Resource@Autowired 两个依赖注入注解的详细对比说明,重点关注它们的区别和使用场景:


📌 核心区别总结

特性@Autowired (Spring)@Resource (JSR-250 标准)
来源Spring 框架原生注解Java 标准 (javax.annotation)
默认注入方式按类型 (byType)按名称 (byName) → 按类型 (byType)
名称指定需配合 @Qualifier("beanName")直接通过 name 属性 (@Resource(name="beanName"))
是否支持可选依赖✅ 支持 (required=false)❌ 必须成功注入,否则报错
构造器/参数注入✅ 支持构造器、方法参数、字段❌ 仅支持字段、Setter 方法
依赖范围Spring 项目专属通用(兼容 Spring/Jakarta EE 等)

🧩 详细功能解析

1️⃣ 注入方式
注解默认行为指定名称的方法
@Autowired按类型```java
@Autowired
@Qualifier(“userDaoImpl”)
private UserDao userDao;
@Resource按名称```java
@Resource(name=“userDaoImpl”)
private UserDao userDao;

推荐实践

  • 存在同名多个 Bean 时优先用 @Resource(name="...")(简洁)
  • 需要明确类型约束时用 @Autowired + @Qualifier
2️⃣ 处理依赖缺失
// @Autowired 支持可选依赖
@Autowired(required = false)
private OptionalComponent component; // 允许为 null// @Resource 必须成功注入
@Resource
private MustExistBean bean; // 缺失时报错
3️⃣ 适用范围
  • @Autowired
    ✅ 字段、构造器、Setter 方法、普通方法、参数
    @Autowired
    public UserService(UserRepo repo) { // 构造器注入this.repo = repo;
    }
    
  • @Resource
    不支持构造器注入
    ✅ 仅支持字段和 Setter 方法
    @Resource
    public void setUserDao(UserDao dao) { // Setter 注入this.userDao = dao;
    }
    

🧪 使用场景建议

场景推荐注解原因
Spring 单体项目@AutowiredSpring 生态原生支持,功能更完整
多模块/多数据源需明确指定@Resource直接通过 name 指定 Bean 更直观简洁 (@Resource(name="masterDB"))
需要可选依赖@Autowired支持 required=false
构造器注入@Autowired@Resource 不支持构造器
跨框架兼容项目@Resource遵循 JSR-250 标准,通用性更强

⚠️ 常见问题避坑

多Bean冲突时的优先级
@Component("daoA")
class UserDaoA implements UserDao {}
@Component("daoB")
class UserDaoB implements UserDao {}// ✅ 明确指定名称可避免歧义
@Service
public class UserService {@Resource(name="daoA")      // 指定使用 daoAprivate UserDao userDao;
}
多模块扫描问题

若出现 NoSuchBeanDefinitionException

  • 检查 @ComponentScan 是否覆盖 Bean 所在的包
  • 多模块项目中确保依赖的子模块包含目标 Bean

🚀 终极选型建议

  1. 新 Spring 项目

    • 优先用 @Autowired:功能更全,支持构造器注入(官方推荐)
    • 配合 Lombok @RequiredArgsConstructor 实现不可变依赖:
      @Service
      @RequiredArgsConstructor
      public class UserService {private final UserRepo repo; // 自动构造器注入
      }
      
  2. 需明确指定名称时
    使用 @Resource(name="...") 更简洁

  3. 兼容 Jakarta EE/旧项目
    选择 @Resource 保证跨环境兼容性


🌰 代码对比示例

// 使用 @Autowired 按类型+名称指定
@Service
public class UserService {@Autowired@Qualifier("mysqlUserRepo")private UserRepo userRepo;
}// 使用 @Resource 按名称指定
@Service
public class UserService {@Resource(name = "mysqlUserRepo")private UserRepo userRepo;
}// 使用 @Autowired 构造器注入(推荐方式)
@Service
public class UserService {private final UserRepo userRepo;@Autowired // Spring 4.3+ 可省略public UserService(UserRepo userRepo) {this.userRepo = userRepo;}
}

最佳实践

  • 强制依赖 → 构造器注入 (@Autowired)
  • 可选依赖 → 字段/Setter注入 (@Autowired(required=false))
  • 需要精确匹配名称 → @Resource(name="...")

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

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

相关文章

php+apache+nginx 更换域名

phpapachenginx 更换域名✅ 第 1 步:确认到底是谁在监听 80/443✅ 第 2 步:按监听者修改配置🔹 场景 A:Apache 直接监听 80/443🔹 场景 B:Nginx 监听 80/443,反向代理到 Apache✅ 第 3 步&#…

AI 视频卫士:AI 无人机巡检,适配多元河道场景的治理利器

河道治理,场景各异,难题不同。城市内河的生活垃圾、景区河道的景观破坏、工业园区河道的工业废料,每一种场景都对巡检工作有着独特的要求。AI 视频卫士,凭借强大的 AI 技术,针对不同河道应用场景,打造专属巡…

累加和校验原理与FPGA实现

累加和校验原理与FPGA实现写在前面一、基础原理二、举个例子2.1 进位累加2.2 回卷累加三、FPGA实现3.1 发送端(产生校验和)3.2 接收端(累加和校验)3.3 仿真结果写在后面写在前面 在上文《奇偶校验原理与FPGA实现》中,讲…

深入解析Go设计模式:命令模式实战

什么是命令模式? 命令模式(Command Pattern)是一种行为型设计模式,它将请求封装为独立对象,从而允许客户端通过不同的请求对象进行参数化配置。该模式支持请求的排队执行、操作记录以及撤销等功能。 命令模式UML类图如下所示: 命令模式包含五个核心角色,具体说明如下: …

Pytest项目_day11(fixture、conftest)

Fixture fixture是一种类似于setup、teardown,用于测试前后进行预备、清理工作的代码处理机制 相比于setup、teardown来说,fixture命名更灵活,局限性更少使用conftest.py配置里面可以实现数据共享,不需要import就能自动找到一些配…

DAY 43 复习日

作业: kaggle找到一个图像数据集,用cnn网络进行训练并且用grad-cam做可视化 划分数据集 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader impo…

Flink运行时的实现细节

一、Flink集群中各角色运行架构先说Flink集群中的角色吧,有三个分别是客户端(Client)、JobManager、TaskManager。客户端负责接收作业任务并进行解析,将解析后的二进制数据发送给JobManager;JobManager是作业调度中心,负责对所有作…

思科、华为、华三如何切换三层端口?

三层交换机融合了二层交换技术与三层转发技术,具备强大的网络功能。主流厂商(思科、H3C、华为)的三层交换机均支持二层端口与三层端口的相互切换,但具体命令存在差异。本文将详细介绍三大厂商设备的端口切换方法及相关知识。一、各…

springboot的基础要点

Spring Boot 的核心设计理念是 ​​"约定优于配置"​​(Convention Over Configuration),旨在简化 Spring 应用的初始搭建和开发过程。以下是需要掌握的核心基础要点:​一、核心机制​​自动配置 (Auto-Configuration)​…

lesson36:MySQL从入门到精通:全面掌握数据库操作与核心原理

目录 一、引言:为什么选择MySQL? 二、MySQL安装与登录配置 2.1 环境准备 2.2 登录指令详解 三、数据库核心操作 3.1 数据库生命周期管理 3.2 数据库存储引擎选择 四、数据表设计与操作 4.1 表结构创建(含数据类型详解) …

Spring源码解析 - SpringApplication run流程-prepareContext源码分析

prepareContext源码分析 private void prepareContext(DefaultBootstrapContext bootstrapContext, ConfigurableApplicationContext context,ConfigurableEnvironment environment, SpringApplicationRunListeners listeners,ApplicationArguments applicationArguments, Bann…

HIS系统:医院信息化建设的核心,采用Angular+Java技术栈,集成MySQL、Redis等技术,实现医院全业务流程管理。

HIS系统在医院信息化建设中扮演着核心的角色。它是一个综合性的信息系统,旨在管理和运营医院的各种业务,包括门诊、住院、财务、物资、科研等。技术细节:前端:AngularNginx后台:JavaSpring,SpringBoot&…

深度学习-卷积神经网络-LeNet

卷积神经网络是一种专门用于处理具有网格结构数据(如图像、音频等)的深度学习模型。它通过卷积层自动提取数据中的特征,利用局部连接和参数共享的特性减少了模型的参数数量,降低了过拟合的风险,同时能够有效地捕捉数据…

【Java项目与数据库、Maven的关系详解】

Java项目与数据库、Maven的关系详解 一、Java项目是否都需要连接本地数据库? 不一定,这取决于项目类型和需求: 1. 需要数据库的项目类型项目类型数据库作用典型场景Web应用存储用户数据/业务数据电商系统、CMS服务端程序持久化数据金融交易系…

两个Maven工程,使用idea开发,工程A中依赖了工程B,改了工程B,工程A如何获取最新代码

两个Maven工程,使用idea开发,工程A中依赖了工程B,改了工程B,工程A如何获取最新代码 如果工程B的版本是快照,那么如下。 步骤一 工程B 执行 clean package install deploy 步骤二 工程A 刷新Maven

奥比中光与地平线、地瓜机器人达成战略合作,携手推动机器人智能化

摘要:机器人“慧眼”与“智脑”强强联合!8月11日,奥比中光与地平线及其控股子公司地瓜机器人在北京签订合作协议,双方将在机器人智能化领域展开深度合作,充分发挥各自的技术与产品优势,携手推动机器人产业的…

【Linux】Tomcat

Tomcat简介Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和 并发访问用户不是很多的场合下被普遍使用,Tomcat 具有处理HTML页面的功能,它还是一个Servlet和 JSP容器Tomcat的使用安装ja…

Putting it all together 将所有内容整合在一起

官方链接 https://www.youtube.com/watch?vAa_FAA3v22g&t1s Task1 Putting It All Together 将所有内容整合在一起 图片版 文字版 Putting It All Together 将所有内容整合在一起 From the previous modules, youll have learned that quite a lot of things go on b…

Python 闭包详解:从变量作用域到实战案例

一、变量作用域基础在 Python 中,变量根据作用范围可分为三类:全局变量:定义在函数外部的变量,作用范围是整个程序。如果在函数内部需要修改全局变量,必须使用global关键字声明。局部变量:定义在函数内部的…

Docker 跨主机容器之间的通信macvlan

默认一个物理网卡,只有一个物理mac地址,虚拟多个mac地址 缺点:每次需要手动配置ip地址,容易ip地址冲突。类似于保存到execl表格里面。 两台物理机: docker-01和docker-02 创建macvlan网络 [rootdocker-01 ~]# docker n…