通俗易懂!2025 年最新 @Autowired 和 @Resource 完全对比 + 避坑指南(面试 100% 会问,背完直接满分)
| 项目 | @Autowired(Spring 自己的) | @Resource(JDK 自带的,Spring 也支持) | 谁才是 2025 年主流? |
|---|---|---|---|
| 来源 | Spring 框架 | JSR-250 规范(Java 标准) | @Autowired 完胜 |
| 注入方式(默认) | byType(先按类型找) | byName(先按名字找) | —— |
| 有多个 Bean 时 | 报错!必须配合 @Qualifier 或 @Primary | 先按 name 找,找不到再按 type 找 | —— |
| 可以不写在字段上 | 可以写在字段、Setter、构造器上 | 只能写在字段或 Setter 上(不能写构造器) | —— |
| 是否支持 @Primary | 支持 | 不支持 | —— |
| 是否支持 required=false | 支持 @Autowired(required=false) | 不支持(只能用 @Autowired 实现可选注入) | —— |
| 2025 项目使用频率 | 99.9% | 不到 1%(基本绝迹) | @Autowired 统治世界 |
@Autowired 2025 年最常用 5 种写法(直接抄)
@Service
public class UserService {
// 1. 字段注入(最常见,最简洁,90%代码这样写)
@Autowired
private UserMapper userMapper;
// 2. 构造器注入(大厂最推荐!支持 final + 可省略 @Autowired)
private final OrderService orderService;
public UserService(OrderService orderService) { // 只有一个构造器,@Autowired 可省!
this.orderService = orderService;
}
// 3. Setter 注入(偶尔用在可选依赖)
private PaymentService paymentService;
@Autowired
public void setPaymentService(PaymentService paymentService) {
this.paymentService = paymentService;
}
// 4. 可选注入(找不到 Bean 也不报错,给 null)
@Autowired(required = false)
private SomeOptionalService optionalService;
// 5. 集合注入(自动把所有实现类装进来)
@Autowired
private List<PayStrategy> payStrategyList; // 会注入所有 PayStrategy 的实现
}
当有多个相同类型 Bean 时怎么选?(面试必考)
// 场景:有两个 UserService 实现
@Qualifier("aliyunSmsService") // 精确指定名字(最常用)
@Autowired
private SmsService smsService;
// 或者在实现类上加 @Primary(主候选)
@Primary
@Service
public class AliyunSmsService implements SmsService {}
// 或者用 @Order 排序(集合注入时生效)
@Order(1)
@Service
public class TencentSmsService implements SmsService {}
@Resource 基本可以埋了,但面试还是会问(记住这三句话就够)
- @Resource(name = “xxx”) → 先按名字找
- 没写 name → 先按字段名找 → 再按类型找
- 找不到直接报错(没有 required=false)
@Resource(name = "userMapper") // 基本没人这么写
private UserMapper userMapper;
2025 年真实项目建议(直接照做)
| 场景 | 推荐写法 |
|---|---|
| 必填依赖(Service、Mapper) | 构造器注入(可省略 @Autowired) |
| 简单工具类、配置类 | 字段注入 @Autowired(最快) |
| 可选依赖 | @Autowired(required = false) |
| 策略模式、插件系统 | @Autowired List 或 Map |
| 老项目还在用 @Resource | 建议全部替换成 @Autowired(更现代、更灵活) |
面试终极 6 连问 + 标准答案(直接背)
- @Autowired 和 @Resource 区别?
→ @Autowired byType,@Resource byName;@Autowired 支持构造器和 required=false,@Resource 不支持。 - 有两个实现类怎么注入?
→ 用 @Qualifier(“beanName”) 或 @Primary。 - 只有一个构造器需要写 @Autowired 吗?
→ 不需要!Spring Boot 2.6+ 自动识别(官方推荐省略)。 - @Autowired 注入 List 会怎样?
→ 自动注入该接口的所有实现,按 @Order 排序。 - 想注入 Map 呢?
→ 自动把所有实现放进去,key 是 beanName。 - @Resource 还有人用吗?
→ 基本没人用了,Spring 团队自己都不推荐,新项目直接 @Autowired。
背完这张表 + 5 种写法 + 6 个答案,
下次面试官问“Spring 自动装配怎么用”,你 1 分钟甩完代码 + 画表,直接拿下 100 分!冲!