@Autowired
和 @Resource
都是用于依赖注入的注解,但它们来自不同的框架,并且在使用方式和功能上有一些区别
区别
- 来源不同:@Autowired 是 Spring 框架提供的注解。@Resource 是 Java EE 规范(JSR-250)提供的注解,Spring 对其进行了支持。
- 注入方式不同:@Autowired 按照类型进行自动装配。如果存在多个相同类型的 bean,则可以通过 @Qualifier 注解来指定要注入的具体 bean。@Resource 可以按照名称或类型进行注入。如果同时指定了名称和类型,则按照名称进行注入;如果只指定了名称,则按照名称进行注入;如果只指定了类型,则按照类型进行注入。
- 对字段和方法的支持不同:@Autowired 可以用于字段、构造函数和方法上。@Resource 可以用于字段和方法上。
- 对属性的支持不同:@Autowired 不支持 name 属性。@Resource 支持 name 属性,可以通过指定名称来注入特定的 bean。
- 优先级不同:如果同时使用了 @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