目录
八、DI的两种方式
九、自动注入
IoC是由IoC容器帮助实例化Bean,并且在IoC容器内部注入关联属性(对象)的过程。 在上面演示的都是如何实例化Bean,下面演示的是如果给Bean注入属性。也就是说在讲解IoC/DI的另 一半功能。
在前面讲解DI时,官方文档明确说明了DI有两种方式。官网说明如下:
翻译过来,就是下图效果:
1. 构造注入
构造注入要求必须在Bean中提供有参构造方法(无参数最好也提供上,这个位置不用。但是其他位置如果没有通过构造注入,默认是调用无参构造。
1.1 检查Bean类中是否有有参构造方法
检查com.bjsxt.pojo.People是否有有参构造方法,并且注意构造方法参数列表类型和参数顺序。
public class People {
private int id;
private String name;
// 无参数构造
public People() {}
// 有参构造
public People(int id, String name) {
this.id = id;
this.name = name;
}
// getter/setter 没有粘贴到文档中
}
1.2 配置bean
在配置文件applicationContext.xml中可以通过的子标签设置构造方法中一个参数的值。
解释说明:
constructor-arg 里面有5个属性,这5个属性分为2类。
(1)用来确定给哪个属性进行赋值
name:参数名称
index:参数索引。从0开始算起。
type:参数类型。8大基本数据类型可以直接写关键字。其他类型需要写类型的全限定路径。 这三个属性如果只需要用到一个就能精确的告诉Spring,要设置的构造方法参数是哪个可以使用一 个。如果无法精确到某个构造方法参数,可以多个一起结合使用。
(2)设置属性的值
value:简单数据类型直接设置。Spring会自动进行类型转换。
ref:需要引用另一个bean的id。也就是说这个参数是一个类类型,且这个类的对象也被Spring 容器管理。
下面代码使用了type进行确认到底给构造方法哪个参数赋值。也可以尝试使用其他的属性来确认参数。
1.3 编写测试类并观察控制台运行结果
/*
DI构造注入
*/
@Test
void constructorDI(){
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
People peo4 = context.getBean("peo4", People.class);
System.out.println(peo4);
}
控制台输出结果包含了配置的值
2.设值注入(setter注入)
2.1 检查Bean类中是否有Setter方法
Setter注入一般都是结合无参构造方法一起使用。所以类中有无参构造方法。
package com.tong.pojo;
public class People {
private int id;
private String name;
public People() {}
public People(int id, String name) {
this.id = id;
this.name = name;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
1.2 配置Bean
重新配置了一个bean标签,并设置id=“peo5”。
通过 标签调用类的setter方法。
1、name:属性名称。
2、value:属性值。
3、ref:引用另一个bean标签的id属性。
1.3 编写测试类并观察控制台结果
在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。
3.构造注入和设值注入的混合使用
也可以让构造注入和设值注入混合使用。这两种方式只要保证有对应的构造方法和setter方法,就可以 使用其中一种方式设置部分属性的值。
先保证People中有一个参数的构造方法,并且包含name属性的setter方法。
package com.tong.pojo;
public class People {
private int id;
private String name;
public People() {}
// 只有id属性的构造方法
public People(int id) {
this.id = id;
}
public People(int id, String name) {
this.id = id;
this.name = name;
}
// getter/setter 没有粘贴到文档中
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Override
public String toString() {
return "People{" + "id=" + id + ", name='" + name + '\'' + '}';
}
}
在配置文件中混合使用两种方式
在测试类中获取peo5的bean,并输出到控制台,查看是否包含设置的值。
4.不同属性类型对应的写法
前面在讲解DI两种实现方式时,属性都是简单数据类型。如果类的属性是数组、集合、对象等类型需要 通过下面方式进行设置。 这些标签都是或的子标签。
一旦使用了下面子标签方式,就不能对 或 设置value属性或ref属 性。且需要在People类中提供对应名称,对应类型的属性。下面示例中没有粘贴People类提供对应类 型,对应名称属性的代码。
4.1 引用其他Bean
如果需要引用其他Bean,直接在property标签中使用ref引用就可以。使用子标签ref也可以,但是没有直接用ref属性的方式简单。
4.2 Set类型
童小纯
听smallming
4.3 List类型
java
前端
4.4 Array类型
小童
张佳明
4.5 Map类型
4.6 Prop值类型
Prop就是Properties类型。Properties是HashTable的子类型。内容满足Key-value。
a1
b1
4.7 Null值类型
在Spring中,允许Bean的自动注入。有两种方式进行配置。
1、在根标签 中配置default-autowire属性。标签整个Spring中自动注入的策略。可取值有5 个。
2、default:默认值。不自动注入。
3、no:不自动注入。
4、byName:通过名称自动注入。会自动寻找容器中与当前属性同名的bean进行注入。
5、byType:通过类型自动注入。会自动寻找容器中与当前bean类型匹配的bean进行注入。如果有多 个相同类型的bean注入会出现异常。
6、constructor:通过构造方法进行注入。寻找bean的构造方法中是否有一个包含其他bean类型的参 数。如果有自动注入进去。类型先byType后byName,如果没找到不注入。注:构造方法类型和其 他Bean的类型相同。
在 标签中配置autowire属性。和default-autowire取值相同。唯一注意default表示全局 default-autowire的值。如果autowire和default-autowire同时存在,autowire生效。
小提示: 自动注入指的都是bean之间的自动注入。能够自动注入必须保证Spring 容器中包含能被自动注入的bean