@Autowired 和 @Resource 的区别

发布于:2024-07-14 ⋅ 阅读:(86) ⋅ 点赞:(0)

@Autowired 和 @Resource 都是用于依赖注入的注解,但它们来自不同的框架,并且在使用方式和功能上有一些区别

区别

  1. 来源不同:@Autowired 是 Spring 框架提供的注解。@Resource 是 Java EE 规范(JSR-250)提供的注解,Spring 对其进行了支持。
  2. 注入方式不同:@Autowired 按照类型进行自动装配。如果存在多个相同类型的 bean,则可以通过 @Qualifier 注解来指定要注入的具体 bean。@Resource 可以按照名称或类型进行注入。如果同时指定了名称和类型,则按照名称进行注入;如果只指定了名称,则按照名称进行注入;如果只指定了类型,则按照类型进行注入。
  3. 对字段和方法的支持不同:@Autowired 可以用于字段、构造函数和方法上。@Resource 可以用于字段和方法上。
  4. 对属性的支持不同:@Autowired 不支持 name 属性。@Resource 支持 name 属性,可以通过指定名称来注入特定的 bean。
  5. 优先级不同:如果同时使用了 @Autowired 和 @Resource 注解,并且它们都能够满足注入要求,那么 @Autowired 的优先级更高。

测试

创建配置类与注入类

@NoArgsConstructor
@AllArgsConstructor
@ToString
@Data
public class Student {
    private String name;
    private Integer age;
    private Double grade;

    public void display(){
        System.out.println("name:"+name+" age:"+age+" grade:"+grade);
    }
}
@Configuration
public class Config {
    // 创建一个名为 "studentAutowired" 的 Student 对象
    @Bean(name = "studentAutowired")
    public Student studentAutowired() {
        return new Student("Alice", 20, 90.5);
    }

    // 创建一个名为 "studentResource" 的 Student 对象
    @Bean(name = "studentResource")
    public Student studentResource() {
        return new Student("Bob", 21, 85.5);
    }
}

1.注入方式测试

  • Autowired无参测试
    @Autowired //@Autowired无参测试
    private Student studentAutowired;

    @Test
    void testStudentAutowired() {
        // 输出注入的 Student 对象信息
        System.out.println("Student Autowired: " + studentAutowired);
        studentAutowired.display();
    }

运行结果:

Student Autowired: Student(name=Alice, age=20, grade=90.5)
name:Alice age:20 grade:90.5
可以看到 @Autowired 默认通过byType的方式进行注入

  • 使用 @Qualifier 指定注入
    @Autowired //@Autowired无参测试
    @Qualifier(value = "studentResource")
    private Student studentAutowired;

    @Test
    void testStudentAutowired() {
        // 输出注入的 Student 对象信息
        System.out.println("Student Autowired: " + studentAutowired);
        studentAutowired.display();
    }

运行结果

Student Resource: Student(name=Bob, age=21, grade=85.5)
name:Bob age:21 grade:85.5


网站公告

今日签到

点亮在社区的每一天
去签到