当前位置: 首页 > 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.dtcms.com/a/327089.html

相关文章:

  • 一键生成 Android 适配不同分辨率尺寸的图片
  • [GESP202309 六级] 2023年9月GESP C++六级上机题题解,附带讲解视频!
  • Airtable 入门指南:从创建项目到基础数据分析与可视化
  • 修复图像、视频和3D场景的AI工具–Inpaint Anything
  • PCIe Electrical Idle Sequences ( EIOS and EIEOS )
  • C++ 中的单例模式:使用静态方法管理唯一实例
  • 告别土味埋点:Java 优雅统计方法耗时的艺术与实践​
  • 企业高性能web服务器(4)
  • 【实时计费系统的Redis实践:视频平台按分钟付费服务的原子扣费与对账】
  • C++11-下
  • JPrint免费的Web静默打印控件:服务端口号修改
  • 医疗矫正流(MedRF)框架在数智化系统中的深度应用
  • 【bug 解决】串口输出字符乱码的问题
  • 【数据结构】——顺序表链表(超详细解析!!!)
  • 【KO】android 音视频
  • 打包工具:WebPack 和 Vite 对比
  • [激光原理与应用-254]:理论 - 几何光学 - 自动对焦在激光器中的应用?
  • 《吃透 C++ 类和对象(上):封装、实例化与 this 指针详解》
  • cpp-httplib 测试https功能
  • 告别数据孤岛!React 路由 3 种传参方法全解析
  • Apache Shiro
  • Gartner 《IAM for LLM-Based AI Agents》学习心得
  • 11. React组件插槽用法
  • 解决 VSCode 无法从右键菜单“通过 Code 打开”文件夹的问题
  • 使用Gradle手搓一个Kotlin/Native项目
  • Nginx 架构和安装
  • Node.js 精选:50 款文件处理与开发环境工具库
  • Mocha在Node.js中的详细使用
  • 阿里云 Windows 服务器 搭建 Gitea 私有 Git 服务器完整教程
  • 云原生高级——nginx