注解@Autowired和@Resource的区别
@Autowired
和 @Resource
都是 Java 依赖注入的注解,但它们在来源、注入机制和使用细节上有重要区别。以下是核心对比:
1. 来源不同
注解 | 所属规范 | 包路径 |
---|---|---|
@Autowired | Spring 框架专属 | org.springframework.beans.factory.annotation |
@Resource | Java 标准 (JSR-250) | javax.annotation |
关键点:
- 用 Spring 项目:两者皆可
- 需兼容非 Spring 环境(如 Jakarta EE):选
@Resource
2. 注入机制对比
@Autowired
- 默认按类型注入(byType)
- 匹配失败时按属性名匹配(隐式 byName)
- 必须搭配
@Qualifier
显式指定 Bean 名@Autowired @Qualifier("mysqlDatabase") private Database database;
@Resource
- 默认按名称注入(byName → 属性名作为 Bean ID)
- 名称未找到时 回退到按类型注入(byType)
- 支持直接指定名称/类型:
@Resource(name = "oracleDatabase", type = Database.class) private Database db;
3. 处理空值的区别
注解 | 允许依赖为空 | 解决方案 |
---|---|---|
@Autowired | 默认不可空 | 设置 @Autowired(required = false) |
@Resource | 默认允许空值 | 无需额外配置 |
关于 @Resource 的空值处理,需要特别注意其默认行为与容器实现的差异,详细说明请看@Resource 注解的空值处理
4. 适用场景示例
场景 1:按类型注入
// 两者等效(唯一实现类时)
@Autowired
private UserRepository userRepo;@Resource
private UserRepository userRepo;
场景 2:多个同类型 Bean
@Component("memCache")
public class MemCache implements Cache { ... }@Component("redisCache")
public class RedisCache implements Cache { ... }// 方式一:@Autowired + @Qualifier
@Autowired
@Qualifier("redisCache") // 显式指定名称
private Cache cache;// 方式二:@Resource 直接指定
@Resource(name = "redisCache") // 按名称注入
private Cache cache;
5. 总结对比表
特性 | @Autowired | @Resource |
---|---|---|
来源 | Spring 专属 | Java 标准 (JSR-250) |
注入顺序 | 类型 → 名称 | 名称 → 类型 |
指定 Bean 名 | 需配合 @Qualifier | 直接 name 属性 |
空值处理 | 默认非空 (required = true ) | 默认可为空 |
依赖 | 需 Spring 环境 | 无框架依赖 (需 javax.annotation ) |
选型建议
- Spring 项目:
- 习惯 Spring 生态 →
@Autowired
- 需要显式指定名称 →
@Resource(nam e= "...")
- 习惯 Spring 生态 →
- 跨框架/标准化项目:
- 优先选择
@Resource
(避免耦合 Spring)
- 优先选择
- 精确控制注入:
- 按类型 →
@Autowired
- 按名称 →
@Resource
- 按类型 →
注意:两者避免混用!同一项目保持统一注解风格。