目录
3.4 byName自动注入@AutoWired和@Qualifier
前言
声明:本专栏文章均为观看动力节点王鹤老师三大框架的视频所撰写的笔记,笔者实力有限,内容如有错误欢迎各位小伙伴在评论区指出。
视频链接:SSM-Spring
👉上文说到利用控制反转的思想可以将创建对象的任务交给Spring容器去执行,对象创建好了以后,自然就要去考虑如何给我们的对象赋值的问题,这同样是Spring容器应该考虑并解决的问题。那么Spring是如何做的呢?首先,Spring使用依赖注入(Dependency Injection),简称DI,实现了控制反转,在此基础上,分别基于xml文件和注解解决了给对象赋值的问题,这就相当于给类的私有属性暴露出两种公共访问方法供人进行属性设置一样,具体如何操作,闲话少说,大家往下看!
1、Bean的装配
Bean的概念:
Bean的英文含义是小豆子的意思,Spring非常形象的将我们需要用到的各种Java对象,比如实体类对象、容器对象、操作接口实现类对象等,都比喻成一颗颗小豆子,然后存放在自己的容器中。
1.1 默认的装配方式
所谓默认装配方式就是指当我们使用ApplicationContext容器创建对象的时候,他会读取配置文件中<bean>并默认调用的是该对象的无参构造方法进行实例化。
1.2 Bean的作用域
除了对象的创建以及对象属性赋值意外,关于类还有一个重要的属性需要关注,那就是对象的作用范围。java基础当中,利用四种不同的访问修饰符可以在类中的使控制其方法变量的使用范围,类似的,关于容器中bean的使用范围,Spring在<bean>标签中提供了一种属性,Scope属性,进行使用范围也就是作用域的指定。
scope属性值 | 作用域 |
singleton(单例模式) | 作用于整个 Spring 容器中,使用 singleton 定义的 Bean 将是单例的,叫这个名称的对象只有一个实例 |
prototype(原型模式) | 作用域每一个调用它的方法中,每次使用 getBean 方法获取的同一个的实例都是一个 新的实例 |
request | 作用于每一个请求中,对于每次 HTTP 请求,都将会产生一个不同的 Bean 实例;该作用域仅适用于web的Spring WebApplicationContext环境 |
session | 对于每个不同的 HTTP session,都将产生一个不同的 Bean 实例; |
2、基于xml的依赖注入
bean实例在调用无参构造器创建对象后,就要对bean对象的属性进行初始化。初始化是由容器自动完成的,称为注入。 根据注入方式的不同,常用的有两类:set注入、构造注入
2.1 set注入(也叫设值注入)
set注入也叫设值注入是指,通过setter方法传入被调用者的实例。这种注入方式简单、直观,因而在Spring的依赖注入中大量使用。
2.1.1 简单类型set注入
Spring中规定java中的基本数据类型和String类型都是简单类型。
创建学生类:
package com.bjpowernode.ba01;
public class Student {
private String name;
private int age;
public Student() {
System.out.println("spring会调用类的无参数构造方法创建对象");
}
public void setName(String name) {
System.out.println("setName:"+name);
this.name = name.toUpperCase();
}
public void setAge(int age) {
System.out.println("setAge:"+age);
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
spring配置文件spring.xml中声明Student类的bean:
<bean id="myStudent" class="com.bjpowernode.ba01.Student" >
<property name="name" value="李四" /><!--setName("李四")-->
<property name="age" value="22" /><!--setAge(21)-->
</bean>
单元测试:
@Test
public void test01(){
System.out.println("=====test01========");
String config="ba01/applicationContext.xml";
ApplicationContext ac = new ClassPathXmlApplicationContext(config);
//从容器中获取Student对象
Student myStudent = (Student) ac.getBean("myStudent");
System.out.println("student对象="+myStudent);
}
2.1.2 引用类型set注入
当指定bean的某属性值为另一bean的实例时,属性值不是设置value而是通过ref指定它们间的引用关系。ref的值必须为某bean的id值。 例如上述学生类的属性中增加一个学校信息。
创建学校类:
package com.bjpowernode.ba02;
public class School {
private String name;
private String address;
public void setName(String name) {
this.name = name;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "School{" +
"name='" + name + '\'' +
", address='" + address + '\'' +
'}';
}
}
Student类中添加School属性,修改如下:
package com.bjpowernode.ba02;
public class Student {
private String name;
private int age;
//声明一个引用类型
private School school;
public Student() {
System.out.println("spring会调用类的无参数构造方法创建对象");
}
// 包名.类名.方法名称
// com.bjpowernode.ba02.Student.setName()
public void se