@Autowired 与@Resource这两种注入方式有什么区别
@Autowired
和 @Resource
都是用于依赖注入的注解,但它们来源不同,使用方式和功能上也有一些区别:
-
来源:
@Autowired
是 Spring 框架提供的注解。@Resource
是 Java EE (现在的 Jakarta EE) 提供的注解,属于 JSR-250 规范。
-
注入方式:
@Autowired
默认按类型(by type)装配依赖对象。@Resource
默认按名称(by name)装配依赖对象。
-
匹配顺序:
@Autowired
:- 首先尝试按类型匹配。
- 如果找到多个类型匹配的 bean,则按属性名作为 bean 名称匹配。
- 可以配合
@Qualifier
注解指定 bean 名称。
@Resource
:- 如果指定了 name 属性,则按 name 匹配。
- 如果没有指定 name,则按属性名作为 bean 名称匹配。
- 如果按名称未找到匹配,则按类型匹配。
- 如果都未匹配,则报错。
-
适用范围:
@Autowired
可以用在构造函数、方法、参数、字段和注解上。@Resource
只能用在字段和方法上。
-
是否可以为空:
@Autowired
默认要求依赖对象必须存在,如果允许 null 值,可以设置@Autowired(required=false)
。@Resource
默认不要求依赖对象必须存在。
-
附加功能:
@Autowired
可以与@Qualifier
配合使用,实现更细粒度的控制。@Resource
可以通过 name 属性直接指定 bean 名称。
-
使用场景:
- 在 Spring 框架中,通常更多地使用
@Autowired
。 - 如果项目对 Java EE 规范有特殊要求,或者想要保持与 Java EE 的兼容性,可以使用
@Resource
。
- 在 Spring 框架中,通常更多地使用
示例:
@Autowired
private UserService userService;
@Resource
private OrderService orderService;
@Autowired
@Qualifier("specialUserService")
private UserService specialUserService;
@Resource(name = "specialOrderService")
private OrderService specialOrderService;
总结:
- 如果你主要使用 Spring 框架,
@Autowired
通常是更好的选择,因为它与 Spring 的其他功能(如@Qualifier
)集成得更好。 - 如果你的项目需要考虑 Java EE 规范的兼容性,或者更喜欢按名称注入,那么
@Resource
可能更适合。