spring注解@Autowired和@Resource

@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就会报错

猜你喜欢

转载自blog.csdn.net/weixin_45742032/article/details/110680103