本文将详细对比一下 @Resource
和 @Autowired
注解:
1. 来源不同
@Resource
是 Java 标准库的注解(javax.annotation.Resource)@Autowired
是 Spring 框架的注解(org.springframework.beans.factory.annotation.Autowired)
2. 注入方式不同
@Resource
的注入顺序:
- 按 name 属性找
- 按字段名找
- 按类型找
@Autowired
的注入顺序:
- 按类型找
- 如果有多个同类型 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. 主要区别
- 注入顺序
@Resource
:名称 -> 类型@Autowired
:类型 -> 名称(通过 @Qualifier)
- 必需性
@Resource
:默认必需,没有 required 属性@Autowired
:默认必需,可以通过 required=false 设置为非必需
- 指定名称
@Resource
:通过 name 属性@Autowired
:通过 @Qualifier 注解
- 使用场景
@Resource
:适合按名称注入的场景@Autowired
:适合按类型注入的场景
5. 最佳实践
- 如果明确知道要注入的 Bean 名称,使用
@Resource
:
@Resource(name = "userService")
private UserService userService;
- 如果主要按类型注入,使用
@Autowired
:
@Autowired
private UserService userService;
- 如果有多个同类型 Bean,需要指定名称:
// 使用 @Resource
@Resource(name = "userService")
private UserService userService;
// 或使用 @Autowired
@Autowired
@Qualifier("userService")
private UserService userService;
- 如果 Bean 是可选的:
@Autowired(required = false)
private UserService userService;
6. 总结
@Resource
更符合 Java 标准,优先按名称注入@Autowired
是 Spring 特有的,优先按类型注入- 两者都能实现依赖注入,选择哪个主要取决于你的具体需求
- 在同一个项目中,建议统一使用一种注解,以保持代码风格一致
AcJava,让技术学习更简单!
我是铭轩,微信:ac_java,欢迎与我随时交流!
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END
暂无评论内容