Java @Resouce 注解和@AutoWired 注解的联系与区别

本文将详细对比一下 @Resource@Autowired 注解:

1. 来源不同

  • @Resource 是 Java 标准库的注解(javax.annotation.Resource)
  • @Autowired 是 Spring 框架的注解(org.springframework.beans.factory.annotation.Autowired)

2. 注入方式不同

@Resource 的注入顺序:

  1. 按 name 属性找
  2. 按字段名找
  3. 按类型找

@Autowired 的注入顺序:

  1. 按类型找
  2. 如果有多个同类型 Bean:
  • 优先使用 @Primary 标注的
  • 或者使用 @Qualifier 指定名称

3. 使用示例

@Configuration
public class AppConfig {
    @Bean
    public UserService userService() {
        return new UserServiceImpl1();
    }

    @Bean
    public UserService userService2() {
        return new UserServiceImpl2();
    }

    @Bean
    @Primary
    public UserService primaryUserService() {
        return new UserServiceImpl3();
    }
}

// 使用 @Resource
class ResourceExample {
    // 1. 按名称注入
    @Resource(name = "userService")
    private UserService service1;  // 注入 userService

    // 2. 按字段名注入
    @Resource
    private UserService userService2;  // 注入 userService2

    // 3. 按类型注入
    @Resource
    private UserService anyName;  // 注入 primaryUserService
}

// 使用 @Autowired
class AutowiredExample {
    // 1. 按类型注入
    @Autowired
    private UserService service1;  // 注入 primaryUserService

    // 2. 使用 @Qualifier 指定名称
    @Autowired
    @Qualifier("userService")
    private UserService service2;  // 注入 userService

    // 3. 允许为空
    @Autowired(required = false)
    private UserService service3;  // 如果找不到对应的 Bean,则注入 null
}

4. 主要区别

  1. 注入顺序
  • @Resource:名称 -> 类型
  • @Autowired:类型 -> 名称(通过 @Qualifier)
  1. 必需性
  • @Resource:默认必需,没有 required 属性
  • @Autowired:默认必需,可以通过 required=false 设置为非必需
  1. 指定名称
  • @Resource:通过 name 属性
  • @Autowired:通过 @Qualifier 注解
  1. 使用场景
  • @Resource:适合按名称注入的场景
  • @Autowired:适合按类型注入的场景

5. 最佳实践

  1. 如果明确知道要注入的 Bean 名称,使用 @Resource
@Resource(name = "userService")
private UserService userService;
  1. 如果主要按类型注入,使用 @Autowired
@Autowired
private UserService userService;
  1. 如果有多个同类型 Bean,需要指定名称:
// 使用 @Resource
@Resource(name = "userService")
private UserService userService;

// 或使用 @Autowired
@Autowired
@Qualifier("userService")
private UserService userService;
  1. 如果 Bean 是可选的:
@Autowired(required = false)
private UserService userService;

6. 总结

  • @Resource 更符合 Java 标准,优先按名称注入
  • @Autowired 是 Spring 特有的,优先按类型注入
  • 两者都能实现依赖注入,选择哪个主要取决于你的具体需求
  • 在同一个项目中,建议统一使用一种注解,以保持代码风格一致

AcJava,让技术学习更简单!
我是铭轩,微信:ac_java,欢迎与我随时交流!
© 版权声明
THE END
喜欢就支持一下吧
点赞54赞赏 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容