Spring 注解依赖注入:@Autowired vs @Resource

发表于 2025-09-14 15:02:41 分类于 默认分类 阅读量 47

Spring 注解依赖注入:@Autowired vs @Resource

在 Spring 中,依赖注入(DI, Dependency Injection)是核心功能之一。常用的注解有 @Autowired@Resource,它们都可以自动注入 Bean,但有一些重要区别。本文将对比说明它们的使用方法与差异。


1. @Autowired

  • 来源:Spring 自身注解(org.springframework.beans.factory.annotation.Autowired
  • 默认按类型注入(byType)
  • 可配合 @Qualifier 指定 Bean 名称
  • 可选属性required(默认 true,是否必须注入)

示例:

@Component
public class UserService {
}

@Component
public class OrderService {

    @Autowired
    private UserService userService;
}
  • Spring 会根据类型 UserService 自动注入对应的 Bean
  • 如果有多个同类型 Bean,可以用 @Qualifier 指定名称:
@Autowired
@Qualifier("specialUserService")
private UserService userService;

2. @Resource

  • 来源:Java 标准注解(javax.annotation.Resource
  • 默认按名称注入(byName),然后按类型(byType)
  • 不依赖 Spring 框架,但在 Spring 容器中可使用
  • 可通过 nametype 属性指定 Bean

示例:

@Component("userService")
public class UserService {
}

@Component
public class OrderService {

    @Resource
    private UserService userService; // 按名称 userService 注入
}
  • 如果 name 对应的 Bean 存在,则按名称注入
  • 如果没有 name,则按类型查找

3. 对比总结

特性@Autowired@Resource
来源SpringJava 标准
默认注入方式按类型(byType)按名称(byName),找不到按类型(byType)
指定 Bean@Qualifier("beanName")@Resource(name="beanName")@Resource(type=UserService.class)
是否必须注入required=true 可选默认必须,未找到抛异常
支持 Spring 特性支持 @Primary@Qualifier不支持 Spring 特有注解,需要通过 nametype 指定

4. 使用建议

  • 推荐使用 @Autowired:Spring 项目中标准用法,更灵活
  • @Resource:适合对接 Java EE 标准或希望按名称注入
  • 如果同类型 Bean 有多个,推荐 @Autowired + @Qualifier 明确注入

5. 示例对比

// @Autowired 按类型注入
@Autowired
private UserService userService;

// @Autowired + @Qualifier 指定名称
@Autowired
@Qualifier("specialUserService")
private UserService userService;

// @Resource 默认按名称注入
@Resource
private UserService userService;

// @Resource 指定名称
@Resource(name = "specialUserService")
private UserService userService;

总结

  • @Autowired:按类型注入,可配合 @Qualifier
  • @Resource:按名称优先注入,兼顾类型
  • Spring 项目推荐使用 @Autowired,Java EE 项目或标准化场景可用 @Resource
正物博客
一路向前,山海自平