腾讯面试官必问:@Autowired 和 @Resource 到底啥区别?90%开发者只知其一!
前言
Spring依赖注入是后端面试常年必考基础题,@Autowired与@Resource的区别出镜率极高。
很多开发者只会粗浅记住一句话:Autowired按类型注入,Resource按名称注入。可面试官一旦追问:
Autowired如何指定Bean名称、Resource归属哪个规范、二者异常处理有何差异、多Bean场景如何选择,大部分人思路混乱、回答片面。
本文从来源定义、匹配规则、属性特性、使用场景、易错误区全方位梳理,搭配面试背诵标准答案,适合日常复习、面试突击,内容可直接用于CSDN、掘金等平台发布。
一、基础来源:归属不同规范
@Autowired
- 归属:Spring框架专属注解,包路径:
org.springframework.beans.factory.annotation.Autowired - 定位:Spring为简化IOC容器依赖注入自研的注解,脱离Spring框架无法使用。
@Resource
- 归属:Java官方JSR-250标准规范,原生JDK自带,包路径:
javax.annotation.Resource - 定位:JavaEE统一注入规范,Spring、JBoss等主流框架均做了兼容适配,框架无关。
一句话总结:Autowired是Spring私有工具,Resource是Java通用标准。
二、核心注入匹配规则(重中之重)
1. @Autowired 匹配流程
- 第一步:优先根据类型byType,在Spring容器中查找对应类型Bean;
- 第二步:若同类型存在多个Bean,自动按照成员变量名称byName二次匹配;
- 第三步:多Bean冲突无法匹配时,必须搭配
@Qualifier("beanName")手动指定Bean名称锁定对象; - 特性:没有name、type属性,只能借助Qualifier限定名称。
2. @Resource 匹配流程
- 第一步:优先根据名称byName,通过变量名/注解name属性查找Bean;
- 第二步:名称查找失败,降级使用类型byType匹配;
- 第三步:名称、类型均匹配失败,直接抛出异常;
- 特性:内置
name、type两个属性,可手动强制指定名称或类型,无需额外注解。
三、关键属性与容错机制
@Autowired
- 独有属性:
required,默认值true;- required=true:必须注入成功,找不到Bean直接抛出
NoSuchBeanDefinitionException; - required=false:注入失败不会报错,变量赋值为null,需要开发者自行规避空指针。
- required=true:必须注入成功,找不到Bean直接抛出
@Resource
- 无required属性,强制必须注入成功,无论名称还是类型匹配失败,都会直接抛出异常;
- 优先级:name > type > 变量名 > 类型。
四、多维度对比表格(面试默写版)
| 对比维度 | @Autowired | @Resource |
|---|---|---|
| 来源 | Spring框架专属 | JSR-250 Java官方标准 |
| 默认匹配规则 | 先byType,再byName | 先byName,再byType |
| 指定Bean方式 | 搭配@Qualifier注解 | 内置name属性直接指定 |
| 容错属性 | 支持required,可允许注入null | 无容错配置,注入失败必报错 |
| 框架依赖性 | 强依赖Spring | Java标准,全框架通用 |
| 多Bean冲突解决 | 必须使用Qualifier | name属性直接限定 |
五、高频面试误区纠正
❌ 误区1:Autowired只能按类型,Resource只能按名称
纠正:二者都支持名称、类型两种匹配方式,只是默认优先级不一样,并非只能单一匹配。
❌ 误区2:Resource是Spring提供的注解
纠正:Resource是JDK原生规范,Spring只是做兼容,切换其他JavaEE框架依旧可用。
❌ 误区3:找不到Bean时两者都一定会报错
纠正:Autowired设置required=false可静默注入null,Resource没有该配置,一定会抛异常。
❌ 误区4:日常开发中二者可以无差别混用
纠正:多Bean场景Autowired需要额外注解,Resource书写更简洁;追求框架通用性优先Resource,Spring项目优先Autowired。
六、实战场景选型指南
推荐使用 @Autowired
- 常规SpringBoot、SSM项目,绝大多数单Bean注入场景;
- 需要做非强制注入,允许对象为null;
- 习惯使用类型绑定,项目统一Spring生态规范。
推荐使用 @Resource
- 同接口多个实现类,需要快速按名称精准注入;
- 项目存在多框架切换需求,想要脱离Spring强依赖;
- 团队统一遵循Java原生开发规范,拒绝使用框架专属注解。
企业主流最佳实践
日常开发90%场景使用@Autowired;多实现类冲突场景,优先@Autowired+@Qualifier,其次使用@Resource(name="xxx")。
七、面试满分口述标准答案(直接背诵)
@Autowired是Spring专属依赖注入注解,默认按照类型匹配Bean,多实例时配合@Qualifier指定名称,支持required属性,可设置非强制注入;
@Resource是JSR-250定义的Java标准注解,默认优先按名称匹配,查找不到再匹配类型,无容错属性,注入失败一定会抛出异常。
日常Spring项目优先使用@Autowired,需要跨框架兼容或快速指定Bean名称时选用@Resource。
总结
二者底层作用完全一致,都是完成IOC容器依赖注入。
核心区别聚焦三点:规范来源、匹配优先级、容错能力。
不用死记硬背,记住:Autowired认类型、可容错;Resource认名字、强约束。