注解@Autowired和@Resource和private final注入三者有什么区别
@Autowired和@Resource和private final注入三者有什么区别
- @Autowired:按“类型”注入(Spring 专属)
- @Resource:按“名称优先”注入(Java 标准)
- private final + 构造器:最安全、最推荐的方式(强类型 + 不可变)
1. 三者的使用方式
1.1 @Autowired(Spring 自己的)
注入规则:默认按类型注入
1 | |
Spring 会去容器中找:
- 类型是
UserService的 Bean - 如果只有 1 个 ✅ 成功
- 如果有多个 ❌ 报错:
NoUniqueBeanDefinitionException
1.1.1 可以配合 @Qualifier 指定名称
1 | |
先按类型,再按名称 精确匹配
1.1.2 Spring 实际注入顺序规则(底层逻辑)
以 @Autowired 为例,真实匹配流程是:
- 按 类型 找 Bean
- 多个 Bean → 看是否有
@Primary - 仍然多个 → 看
@Qualifier - 还不唯一 → 报错
1.2 @Resource(Java 标准注解)
来自:javax.annotation / jakarta.annotation
✅ 不依赖 Spring,属于 Java 官方规范
1.2.1 注入规则:先按名称,再按类型
1 | |
查找顺序:
- 先按 属性名
userService去找 Bean - 找不到 → 再按 类型 UserService 查找
1.2.2 可以显式指定名称
1 | |
直接按Bean名称匹配
1.3 private final + 构造器注入(✅当前最推荐)
这是 Spring 官方文档 + 阿里开发规范 + 大厂项目的标准做法。
1 | |
或者配合 Lombok的@RequiredArgsConstructor:
1 | |
本质还是 @Autowired
Spring 在:
- 只有一个构造器时
- 即使你不写 @Autowired,也会自动注入
1 | |
2. 三者核心区别一张表
| 对比项 | @Autowired |
@Resource |
private final + 构造器 |
|---|---|---|---|
| 来源 | Spring | Java 标准 | Java + Spring |
| 注入方式 | 默认按 类型 | 默认按 名称 | 按 类型 |
| 是否必须 | 支持 required=false |
不支持 | 构造器强制 |
| 依赖是否显式 | ❌ | ❌ | ✅ |
| 是否推荐 | 一般 | 一般 | ✅✅✅ |
| 适合生产项目 | ⚠️ | ⚠️ | ✅ 默认首选 |
3. 项目中应该怎么选?(实战建议)
企业级项目统一规范:只用“构造器注入 + private final”
1 | |