注解@Autowired和@Resource和private final注入三者有什么区别

@Autowired和@Resource和private final注入三者有什么区别

  • @Autowired:按“类型”注入(Spring 专属)
  • @Resource:按“名称优先”注入(Java 标准)
  • private final + 构造器:最安全、最推荐的方式(强类型 + 不可变)

1. 三者的使用方式

1.1 @Autowired(Spring 自己的)

注入规则:默认按类型注入

1
2
@Autowired
private UserService userService;

Spring 会去容器中找:

  • 类型是 UserService 的 Bean
  • 如果只有 1 个 ✅ 成功
  • 如果有多个 ❌ 报错:NoUniqueBeanDefinitionException

1.1.1 可以配合 @Qualifier 指定名称

1
2
3
@Autowired
@Qualifier("userServiceImpl")
private UserService userService;

先按类型,再按名称 精确匹配

1.1.2 Spring 实际注入顺序规则(底层逻辑)

@Autowired 为例,真实匹配流程是:

  1. 类型 找 Bean
  2. 多个 Bean → 看是否有 @Primary
  3. 仍然多个 → 看 @Qualifier
  4. 还不唯一 → 报错

1.2 @Resource(Java 标准注解)

来自:javax.annotation / jakarta.annotation
不依赖 Spring,属于 Java 官方规范

1.2.1 注入规则:先按名称,再按类型

1
2
@Resource
private UserService userService;

查找顺序:

  1. 先按 属性名 userService 去找 Bean
  2. 找不到 → 再按 类型 UserService 查找

1.2.2 可以显式指定名称

1
2
@Resource(name = "userServiceImpl")
private UserService userService;

直接按Bean名称匹配

1.3 private final + 构造器注入(✅当前最推荐)

这是 Spring 官方文档 + 阿里开发规范 + 大厂项目的标准做法

1
2
3
4
5
6
7
8
9
@Service
public class OrderService {

private final UserService userService;

public OrderService(UserService userService) {
this.userService = userService;
}
}

或者配合 Lombok的@RequiredArgsConstructor

1
2
3
4
5
6
@RequiredArgsConstructor
@Service
public class OrderService {

private final UserService userService;
}

本质还是 @Autowired

Spring 在:

  • 只有一个构造器时
  • 即使你不写 @Autowired,也会自动注入
1
public OrderService(UserService userService) {} // 自动注入

2. 三者核心区别一张表

对比项 @Autowired @Resource private final + 构造器
来源 Spring Java 标准 Java + Spring
注入方式 默认按 类型 默认按 名称 类型
是否必须 支持 required=false 不支持 构造器强制
依赖是否显式
是否推荐 一般 一般 ✅✅✅
适合生产项目 ⚠️ ⚠️ ✅ 默认首选

3. 项目中应该怎么选?(实战建议)

企业级项目统一规范:只用“构造器注入 + private final”

1
2
3
4
5
6
7
@Service
@RequiredArgsConstructor
public class DrugService {

private final DrugRepository drugRepository;
private final RedisTemplate redisTemplate;
}