1)自动装配的相关概念
什么是自动装配?
构造注入和setter注入有时在做配置时比较麻烦。所以框架为了提高开发效率,提供自动装配功能,用于简化配置。而所谓的自动装配,指的是spring容器依据某种规则(自动装配的规则,有五种),自动建立对象之间的依赖关系。而spring框架式默认不支持自动装配的,要想使用自动装配,则需要修改spring配置文件中标签的autowire属性。
autowire的取值有哪些?
1)no:
不支持自动装配功能。
2)default:
表示默认采用上一级标签的自动装配的取值。如果存在多个配置文件的话,那么每一个配置文件的自动装配方式都是独立的。
3)byName:
当一个bean节点带有 autowire="byName" 的属性时:
①将查找其类中所有属性。
②去配置文件中查找是否存在id名称与属性名称相同的bean。
③如果有,就取得该bean对象,并调用属性所在类中的setter方法,将找到的bean注入;找不到注入null。
注意:不可能找到多个符合条件的bean(id唯一)
4)byType:
当一个bean节点带有 autowire="byType" 的属性时:
①将查找其类中所有属性。
②去配置文件中查找是否存在bean类型与属性类型相同的bean。
③如果有,就取得该bean对象,并调用属性所在类中的setter方法,将找到的bean注入;找不到注入null。
注意:找到多个符合条件的bean时会报错。
5)constructor:
使用构造方法完成对象注入,其实也是根据构造方法的参数类型进行对象查找,相当于采用byType的方式。即:根据构造方法的参数的数据类型,进行 byType 模式的自动装配。
2)使用byName进行自动装配
实体类:服务员类
public class Waiter {
public Waiter() {
System.out.println("Waiter()");
}
}
实体类:餐馆类
public class Restaurant {
private Waiter waiter;
public Restaurant() {
System.out.println("Restaurant()");
}
public Restaurant(Waiter waiter) {
System.out.println("Restaurant(Waiter waiter)");
this.waiter = waiter;
}
public Waiter getWaiter() {
return waiter;
}
public void setWaiter(Waiter waiter) {
System.out.println("setWaiter(Waiter waiter)");
this.waiter = waiter;
}
@Override
public String toString() {
return "Restaurant [waiter=" + waiter + "]";
}
}
配置文件
测试类
public class TestDI {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Restaurant restaurant = ac.getBean("restaurant", Restaurant.class);
System.out.println(restaurant);
}
}
测试结果
Waiter()
Restaurant()
setWaiter(Waiter waiter)
Restaurant [waiter=entity.Waiter@4abdb505]
3)使用byType进行自动装配
实体类:服务员类
public class Waiter {
public Waiter() {
System.out.println("Waiter()");
}
}
实体类:餐馆类
public class Restaurant {
private Waiter waiter;
public Restaurant() {
System.out.println("Restaurant()");
}
public Restaurant(Waiter waiter) {
System.out.println("Restaurant(Waiter waiter)");
this.waiter = waiter;
}
public Waiter getWaiter() {
return waiter;
}
public void setWaiter(Waiter waiter) {
System.out.println("setWaiter(Waiter waiter)");
this.waiter = waiter;
}
@Override
public String toString() {
return "Restaurant [waiter=" + waiter + "]";
}
}
配置文件
测试类
public class TestDI {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Restaurant restaurant = ac.getBean("restaurant", Restaurant.class);
System.out.println(restaurant);
}
}
测试结果
Waiter()
Restaurant()
setWaiter(Waiter waiter)
Restaurant [waiter=entity.Waiter@5bfbf16f]
4)使用constructor进行自动装配
实体类:服务员类
public class Waiter {
public Waiter() {
System.out.println("Waiter()");
}
}
实体类:餐馆类
public class Restaurant {
private Waiter waiter;
public Restaurant() {
System.out.println("Restaurant()");
}
public Restaurant(Waiter waiter) {
System.out.println("Restaurant(Waiter waiter)");
this.waiter = waiter;
}
public Waiter getWaiter() {
return waiter;
}
public void setWaiter(Waiter waiter) {
System.out.println("setWaiter(Waiter waiter)");
this.waiter = waiter;
}
@Override
public String toString() {
return "Restaurant [waiter=" + waiter + "]";
}
}
配置文件
测试类
public class TestDI {
@Test
public void test() {
ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
Restaurant restaurant = ac.getBean("restaurant", Restaurant.class);
System.out.println(restaurant);
}
}
测试结果
Waiter()
Restaurant(Waiter waiter)
Restaurant [waiter=entity.Waiter@298a5e20]
Disconnected from the target VM, address: '127.0.0.1:55892', transport: 'socket'