Spring的自动装配

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'

你可能感兴趣的:(spring,autowire)