当前位置: 首页 > news >正文

【后端】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.lryc.cn/news/619144.html

相关文章:

  • 告别数据孤岛!React 路由 3 种传参方法全解析
  • [Robotics_py] 定位滤波器 | 预测与更新 | 扩展卡尔曼滤波器(`EKF`)
  • 嵌入式学习 标准IO(完整版)
  • 浏览器面试题及详细答案 88道(12-22)
  • 【C#补全计划】StringBuilder
  • 【shell脚本编程】-4 shell脚本编写冒泡排序
  • C++11新增关键字和范围for循环
  • Flutter ExpansionPanel组件(可收缩的列表)
  • Qt中定时器介绍和使用
  • Gradle(二)Gradle的优势、项目结构介绍
  • python2操作neo4j
  • HTTPS加密与私有CA配置全攻略
  • spring-cloud整合nacos详细攻略
  • 读《精益数据分析》:UGC平台的数据指标梳理
  • 11-docker单机版的容器编排工具docker-compose基本使用
  • 数据分析专栏记录之 -基础数学与统计知识
  • Threejs 设置灯光照射点位置 辅助器不跟随移动
  • 大数据中的数据压缩原理
  • QT第五讲-控件QLineEdit、QSpinBox、QSlider、QScrollBar、QDial、QProgressBar、QLCDNumber
  • 计算机网络摘星题库800题笔记 第4章 网络层
  • 前端最新Vue2+Vue3基础入门到实战项目全套教程,自学前端vue就选黑马程序员,一套全通关!笔记
  • MCU中的液晶显示屏LCD(Liquid Crystal Display)控制器
  • VUE的8个生命周期
  • C++list(2)
  • 【JavaEE】多线程之线程安全(上)
  • 串口通信学习
  • 【PyTorch学习笔记 - 03】 Transforms
  • Spring-Cache 缓存数据
  • Dubbo 3.x源码(33)—Dubbo Consumer接收服务调用响应
  • 赛灵思ZYNQ官方文档UG585自学翻译笔记:UART Controller,通用异步收发传输器控制器