Skip to content

@Autowired 和 @Resource 的区别是什么?

约 535 字大约 2 分钟

Spring框架小红书

2025-03-13

⭐ 题目日期:

小红书 - 2024/11/11

📝 题解:

在 Spring 中,@Autowired@Resource 都用于依赖注入,但它们在 实现机制注入规则适用场景 上有显著区别。以下是两者的对比分析:


1. 核心区别总结

img


2. 详细对比

(1) 默认注入规则

  • @Autowired
    • 默认按 类型 匹配 Bean。

    • 示例

    • @Autowired
      private UserService userService;  // 注入类型为 UserService 的 Bean
    • 冲突处理:若存在多个同类型 Bean(如多个 UserService 实现类),需配合 @Qualifier 指定名称:

    • @Autowired
      @Qualifier("userServiceImplA")
      private UserService userService;
  • @Resource
    • 默认按 名称 匹配 Bean(字段名或 name 属性)。

    • 示例

    • @Resource
      private UserService userService;  // 按字段名 "userService" 查找 Bean
    • 冲突处理:若未找到同名 Bean,回退到按类型匹配。也可显式指定 nametype

    • @Resource(name = "userServiceImplA")
      private UserService userService;

(2) 处理多个候选 Bean

  • @Autowired 的歧义性: 当存在多个同类型 Bean 时,必须明确指定 @Qualifier,否则抛出 NoUniqueBeanDefinitionException
@Autowired
@Qualifier("userServiceImplA")
private UserService userService;
  • @Resource 的灵活性: 通过 name 属性直接指定 Bean 名称,或通过 type 属性指定类型(但需确保唯一)。
@Resource(name = "userServiceImplA", type = UserServiceImplA.class)
private UserService userService;

(3) 可选依赖处理

  • @Autowired 允许注入失败:
@Autowired(required = false)
private OptionalDependency optionalDep;  // 允许 optionalDep 为 null
  • @Resource 必须注入成功: 若未找到匹配的 Bean,抛出 NoSuchBeanDefinitionException,无 required 属性。

3. 使用场景建议

img

4. 示例对比

(1) 按类型注入

// @Autowired 按类型匹配
@Autowired
private UserRepository userRepository;
// @Resource 按类型回退
@Resource
private UserRepository userRepository;

(2) 按名称注入

// @Autowired + @Qualifier 指定名称
@Autowired
@Qualifier("jdbcUserRepository")
private UserRepository userRepository;
// @Resource 直接指定名称
@Resource(name = "jdbcUserRepository")
private UserRepository userRepository;

5. 总结

  • 优先使用 @Autowired: 在 Spring 项目中推荐使用 @Autowired,结合 @Qualifier 解决歧义性,代码更符合 Spring 生态规范。
  • 使用 @Resource 的场景
    • 需要按名称注入。
    • 项目需兼容非 Spring 容器。
    • 避免引入 Spring 特定注解(如纯 Java 配置项目)。

两者各有优劣,根据具体需求选择,确保代码清晰且依赖管理高效。