注解@Autowired和@Resource的区别

发布于:2025-07-15 ⋅ 阅读:(18) ⋅ 点赞:(0)

@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)

选型建议

  1. Spring 项目
    • 习惯 Spring 生态 → @Autowired
    • 需要显式指定名称 → @Resource(nam e= "...")
  2. 跨框架/标准化项目
    • 优先选择 @Resource (避免耦合 Spring)
  3. 精确控制注入
    • 按类型 → @Autowired
    • 按名称 → @Resource

注意:两者避免混用!同一项目保持统一注解风格。


网站公告

今日签到

点亮在社区的每一天
去签到