@Autowired和@Resource的区别
测试准备
创建Student 类、School类、PrimarySchool类并对基本数据类型采用注解方式进行赋值
//Student引用school
public class Student {
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
public School getSchool() {
return school;
}
public void setSchool(School school) {
this.school = school;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public int getSage() {
return sage;
}
public void setSage(int sage) {
this.sage = sage;
}
@Override
public String toString() {
return "Student{" +
"school=" + school +
", sname='" + sname + '\'' +
", sage=" + sage +
'}';
}
}
public class School {
@Value("北京大学附属一中")
private String name;
@Value("私立小学")
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", type='" + type + '\'' +
'}';
}
}
//PrimarySchool是School 的子类
public class PrimarySchool extends School {
}
在spring的配置文件中扫包配置
<!-- 扫描注解,这样com.liu包下的文件都能被扫描 -->
<context:component-scan base-package="com.liu.pojo"/>
测试类
public class StudentTest {
@Test
public void test(){
ClassPathXmlApplicationContext classPathXmlApplicationContext = new ClassPathXmlApplicationContext("applicationContext.xml");
Student myStudent =(Student) classPathXmlApplicationContext.getBean("student");
System.out.println(myStudent);
}
}
测试一(@Autowired默认类型)
注解方式将Student引入spring中
并在Student的school属性添加@Autowired注解
注解方式将PrimarySchool引入spring中
@Component
public class Student {
@Autowired
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
//。。。省略其他代码
}
@Component("myShool")
public class PrimarySchool extends School {
}
测试类运行后结果1
然后删除PrimarySchool 的@Component注解,在School类上加上@Component注解
public class PrimarySchool extends School {
}
@Component("myShool")
public class School {
@Value("北京大学附属一中")
private String name;
@Value("私立小学")
private String type;
//。。。省略其他代码
}
测试类运行后结果2
测试一结论
根据运行后结果1和运行后结果2可以看出Student 的School属性添加@Autowired可以引入School类型也可以引入School的子类PrimarySchool 并且@Component(“myShool”)的指定值不是“shool”,由此得出结论**@Autowired默认属于bytype类型,@Autowired可以默认自动引入同一类型的对象(也就是说可以引入某一类对象或者该类的子类对象),与spring中been的id(也就是@Component(“myShool”)指定的“myShool”)没有关系**
测试二(@Autowired类型也可以设置byName引入方式)
@Qualifier(“school”)可以将@Autowired引入方式设置byName
@Autowired(required = false)required 默认是 true如果school是null会报cuo,required = false不会报错
@Component
public class Student {
@Autowired(required = false)
@Qualifier("school")
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
//。。。省略其他代码
}
测试类运行后结果3
将Qualifier指定的值设置为spring指定对象的id(也就是myShool类@Component(“myShool”)指定的值)
@Component
public class Student {
@Autowired(required = false)
@Qualifier("myShool")
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
//。。。省略其他代码
}
测试类运行后结果4
测试二结论
@Qualifier注解可以将@Autowired引入方式设置为byName
测试三(@Resource先根据byName引入,如果byName没有查找到就会根据byType查找引入)
PrimarySchool 类@Component指定值为“myShool”
Student 类的School 采用@Resource引入
@Component("myShool")
public class PrimarySchool extends School {
}
public class School {
@Value("北京大学附属一中")
private String name;
@Value("私立小学")
private String type;
//。。。省略其他代码
}
@Component
public class Student {
@Resource
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
//。。。省略其他代码
}
测试类运行后结果5
将Student的@Resource设置只使用byName方式@Resource(name = “school”)
@Component
public class Student {
@Resource(name = "school")
private School school;
@Value("张三")
private String sname;
@Value("22")
private int sage;
//。。。省略其他代码
}
测试类运行后结果7
测试三结论
@Resource默认先根据byName引入,如果byName没有查找到就会根据byType查找引入,如果@Resource设置byName方式,如果找不到been的id就会报错