@Resource和@Autowired注解的区别

2024-03-04

1. 来源不同
Autowired来自spring,`import org.springframework.beans.factory.annotation.Autowired;`。
Resource来自java ee标准,`import jakarta.annotation.Resource;`。

2. 默认注入策略:
@Autowired:默认按照类型进行自动装配。
这里的“类型”是指Java类的类型,包括但不限于接口、抽象类和具体实现类。比如,如果一个类有一个成员变量或setter方法参数被@Autowired注解标记,并且该变量或参数类型是某个接口MyInterface,那么Spring容器会在其管理的所有Bean中查找实现了MyInterface接口的Bean,并将其注入到这个字段或setter方法上。
如果一个接口有多个实现类,则会抛出异常,除非指定了限定符如@Qualifier或使用了@Primary注解来标记首选bean。
@Qualifier 指定要注入的 bean 的名称,当类型和名称都匹配时,注入成功。

@Resource:默认情况下按照名称进行装配。如果指定name属性,将根据名称查找bean;如果没有明确指定name但指定了type属性,则按照类型查找并注入。若两者均未指定,某些实现(如Spring)会尝试按名称匹配(字段名或者setter方法名),若找不到则再按类型匹配。

3. 属性设置:
@Autowired:不提供显式的名字属性,仅通过类型推断进行注入。
@Resource:提供了name和type两个属性,可以更加灵活地控制注入的目标。
编译器提示与IDE支持:

在集成开发环境中,由于@Autowired是Spring特有的,而@Resource是标准Java EE注解,IDE对它们的支持程度可能有所不同,比如IDEA可能会在适用场景上给出不同的代码提示和错误检查。
使用场景:

两者通常都可以应用于字段、构造器以及setter方法上进行依赖注入。
总结来说,当需要精确控制依赖注入时,@Resource允许更细粒度的控制,尤其在需要基于名称而不是类型进行注入时更为有用。而@Autowired则相对简单直接,默认行为是按照类型进行注入。在只有一个实现类的情况下,两者确实可以互换使用,但在存在多个同类型候选bean时,使用@Resource配合name属性或使用@Autowired配合@Qualifier会有不同的效果。