Spring 注解依赖注入:@Autowired
vs @Resource
在 Spring 中,依赖注入(DI, Dependency Injection)是核心功能之一。常用的注解有 @Autowired
和 @Resource
,它们都可以自动注入 Bean,但有一些重要区别。本文将对比说明它们的使用方法与差异。
1. @Autowired
- 来源:Spring 自身注解(
org.springframework.beans.factory.annotation.Autowired
) - 默认按类型注入(byType)
- 可配合
@Qualifier
指定 Bean 名称 - 可选属性:
required
(默认true
,是否必须注入)
示例:
@Component
public class UserService {
}
@Component
public class OrderService {
@Autowired
private UserService userService;
}
- Spring 会根据类型
UserService
自动注入对应的 Bean - 如果有多个同类型 Bean,可以用
@Qualifier
指定名称:
@Autowired
@Qualifier("specialUserService")
private UserService userService;
2. @Resource
- 来源:Java 标准注解(
javax.annotation.Resource
) - 默认按名称注入(byName),然后按类型(byType)
- 不依赖 Spring 框架,但在 Spring 容器中可使用
- 可通过
name
或type
属性指定 Bean
示例:
@Component("userService")
public class UserService {
}
@Component
public class OrderService {
@Resource
private UserService userService; // 按名称 userService 注入
}
- 如果
name
对应的 Bean 存在,则按名称注入 - 如果没有
name
,则按类型查找
3. 对比总结
特性 | @Autowired | @Resource |
---|---|---|
来源 | Spring | Java 标准 |
默认注入方式 | 按类型(byType) | 按名称(byName),找不到按类型(byType) |
指定 Bean | @Qualifier("beanName") | @Resource(name="beanName") 或 @Resource(type=UserService.class) |
是否必须注入 | required=true 可选 | 默认必须,未找到抛异常 |
支持 Spring 特性 | 支持 @Primary 、@Qualifier 等 | 不支持 Spring 特有注解,需要通过 name 或 type 指定 |
4. 使用建议
- 推荐使用
@Autowired
:Spring 项目中标准用法,更灵活 @Resource
:适合对接 Java EE 标准或希望按名称注入- 如果同类型 Bean 有多个,推荐
@Autowired + @Qualifier
明确注入
5. 示例对比
// @Autowired 按类型注入
@Autowired
private UserService userService;
// @Autowired + @Qualifier 指定名称
@Autowired
@Qualifier("specialUserService")
private UserService userService;
// @Resource 默认按名称注入
@Resource
private UserService userService;
// @Resource 指定名称
@Resource(name = "specialUserService")
private UserService userService;
总结
@Autowired
:按类型注入,可配合@Qualifier
@Resource
:按名称优先注入,兼顾类型- Spring 项目推荐使用
@Autowired
,Java EE 项目或标准化场景可用@Resource