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

注解@Autowired和@Resource的区别

@Autowired@Resource 都是 Java 依赖注入的注解,但它们在来源、注入机制和使用细节上有重要区别。以下是核心对比:


1. 来源不同

注解所属规范包路径
@AutowiredSpring 框架专属org.springframework.beans.factory.annotation
@ResourceJava 标准 (JSR-250)javax.annotation

关键点

  • 用 Spring 项目:两者皆可
  • 需兼容非 Spring 环境(如 Jakarta EE):选 @Resource

2. 注入机制对比

@Autowired
  • 默认按类型注入(byType)
  • 匹配失败时按属性名匹配(隐式 byName)
  • 必须搭配 @Qualifier 显式指定 Bean 名
    @Autowired 
    @Qualifier("mysqlDatabase")
    private Database database;
    
@Resource
  • 默认按名称注入(byName → 属性名作为 Bean ID)
  • 名称未找到时 回退到按类型注入(byType)
  • 支持直接指定名称/类型
    @Resource(name = "oracleDatabase", type = Database.class)
    private Database db;
    

3. 处理空值的区别

注解允许依赖为空解决方案
@Autowired默认不可空设置 @Autowired(required = false)
@Resource默认允许空值无需额外配置

关于 @Resource 的空值处理,需要特别注意其默认行为与容器实现的差异,详细说明请看@Resource 注解的空值处理


4. 适用场景示例

场景 1:按类型注入
// 两者等效(唯一实现类时)
@Autowired
private UserRepository userRepo;@Resource
private UserRepository userRepo;
场景 2:多个同类型 Bean
@Component("memCache")
public class MemCache implements Cache { ... }@Component("redisCache")
public class RedisCache implements Cache { ... }// 方式一:@Autowired + @Qualifier
@Autowired
@Qualifier("redisCache")  // 显式指定名称
private Cache cache;// 方式二:@Resource 直接指定
@Resource(name = "redisCache")  // 按名称注入
private Cache cache;

5. 总结对比表

特性@Autowired@Resource
来源Spring 专属Java 标准 (JSR-250)
注入顺序类型 → 名称名称 → 类型
指定 Bean 名需配合 @Qualifier直接 name 属性
空值处理默认非空 (required = true)默认可为空
依赖需 Spring 环境无框架依赖 (需 javax.annotation)

选型建议

  1. Spring 项目
    • 习惯 Spring 生态 → @Autowired
    • 需要显式指定名称 → @Resource(nam e= "...")
  2. 跨框架/标准化项目
    • 优先选择 @Resource (避免耦合 Spring)
  3. 精确控制注入
    • 按类型 → @Autowired
    • 按名称 → @Resource

注意:两者避免混用!同一项目保持统一注解风格。

http://www.dtcms.com/a/278564.html

相关文章:

  • CentOS7 OpenSSL升级1.1.1t;OpenSSH 升级 9.8p1 保姆级教程
  • jenkins 流水线比较简单直观的
  • 《每日AI-人工智能-编程日报》--2025年7月14日
  • Spring Boot - Spring Boot 集成 MyBatis 分页实现 PageHelper
  • 17.Python 中的相等性比较:== vs is
  • 具身智能零碎知识点(五):VAE中对使用KL散度的理解
  • 【Java EE初阶 --- 网络原理】初识网络
  • flink 和 spark 架构的对比
  • 如何在 Java 中使用 Redis 实现缓存优化?
  • 4G模块 A7670发送英文短信到手机
  • 11.设置 Python 3 和 pip 3 为默认版本
  • Google的Mediapipe开源框架介绍及使用说明
  • 基于浅切多道的晶圆切割 TTV 均匀性控制与应力释放技术
  • python学智能算法(十八)|SVM基础概念-向量点积
  • CentOS 安装jenkins笔记
  • windows在anaconda中下载安装fasttext
  • jenkins搭建笔记
  • .gitignore文件中的各种写法详解
  • JMeter 连接与配置 ClickHouse 数据库
  • JavaScript 高级封装方法指南
  • 将CSDN文章导出为PDF
  • RabbitMQ的介绍与安装
  • 嵌入式小记
  • 亚马逊自养号技术栈解析:从环境隔离到AI行为模拟的实战指南
  • C++编程语言:标准库:内存和资源管理(Bjarne Stroustrup)
  • 对偶原理与蕴含定理
  • UART寄存器介绍
  • 解决安装 make 时 “configure: error: C compiler cannot create executables” 报错
  • 用于监测线性基础设施的分布式声学传感:现状与趋势
  • week3