当前位置: 首页 > 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.xdnf.cn/news/1289629.html

相关文章:

  • 通用同步/异步收发器USART串口
  • excel-随笔记
  • [ 数据结构 ] 时间和空间复杂度
  • Python初学者笔记第二十二期 -- (JSON数据解析)
  • VGG改进(2):基于Local Attention的模型优化
  • 【图像算法 - 13】基于 YOLO12 与 OpenCV 的实时目标点击跟踪系统(系统介绍 + 源码详细)
  • 获取数组,字符串,集合的长度
  • C++——高性能组件
  • 算法打卡力扣第88题:合并两个有序数组(easy)
  • 解释 Spring MVC 的工作原理
  • _init__.py的作用
  • 智能装配线cad【8张】三维图+设计说明书
  • linux 执行ls命令文件夹显示全白色
  • Langchain入门:文本摘要
  • 多轮问答与指代消解
  • 一维数组的创建、初始化与使用指南
  • “生成式UI革命”:Tambo AI如何让你的应用“开口说话、动手搭界面” | 全面深剖、案例实践与未来展望
  • Python函数篇:从零到精通
  • ubuntu24下keychorn键盘连接不了的改建页面的问题修复
  • 每日任务day0812:小小勇者成长记之挤牛奶
  • 10-docker基于dockerfile自动制作镜像
  • 熟悉并使用Spring框架 - 注解篇
  • golang的继承
  • 【Python办公】Mermaid代码转图片工具 - Tkinter GUI版本
  • NY198NY203美光固态闪存NY215NY216
  • Android 项目:画图白板APP开发(一)——曲线优化、颜色、粗细、透明度
  • OpenHarmony编译与烧录
  • 1小时 MySQL 数据库基础速通
  • 服务端配置 CORS解决跨域问题的原理
  • 安卓主题定制实践:17.45MB轻量级主题引擎技术解析