@Autowired默认按类型注入,需配合@Qualifier指定名称;@Resource默认按名称注入,找不到再按类型,更符合Java标准且跨框架。

@Autowired 和 @Resource 都能完成依赖注入,但底层逻辑、默认行为和适用场景明显不同。
来源与标准不同
@Autowired 是 Spring 框架原生注解(org.springframework.beans.factory.annotation.Autowired),只在 Spring 容器中生效;
@Resource 是 Java 官方规范注解(jakarta.annotation.Resource,JDK 9+;旧版为 javax.annotation.Resource),属于 JSR-250 标准,不依赖 Spring,可跨框架使用。
默认注入策略不同
@Autowired 默认按类型(byType)查找:
→ 找到唯一匹配类型 Bean,直接注入;
→ 找到多个同类型 Bean,抛出 NoUniqueBeanDefinitionException;
→ 此时需配合 @Qualifier("beanName") 明确指定名称。
@Resource 默认按名称(byName)查找:
→ 优先用变量名(如 userService → 查找名为 userService 的 Bean);
→ 名称找不到,再退化为按类型(byType)匹配;
→ 可直接用 @Resource(name = "userServiceImpl1") 指定名称,无需额外注解。
支持的参数和注入位置不同
@Autowired 支持 required 属性(默认 true),设为 false 时允许注入失败不报错;
支持字段、构造方法(Spring 4.3+ 单构造器可省略)、setter 方法、甚至普通方法参数。
@Resource 支持 name 和 type 等多个属性,但没有 required 属性——找不到就直接报错;
支持字段和 setter 方法,不支持构造方法注入(截至 2026 年 10 月)。
实际选型建议
- 项目强依赖 Spring Boot,且接口实现类常有多个 → 用
@Autowired + @Qualifier更明确、IDE 提示更友好; - 希望代码更“标准”、未来可能迁移到非 Spring 环境 → 优先用
@Resource; - 构造器注入是推荐实践 → 只能选
@Autowired; - 变量名恰好与目标 Bean 名一致(如
@Service("orderService")+private OrderService orderService;)→@Resource写法更简洁。


















