Spring基于xml依赖注入的两种方式(构造器和Setter)

1. Dependency injection (DI)

依赖注入(DI)是一个过程,通过该过程,对象只能通过构造函数参数,工厂方法的参数或在构造或创建对象实例后在对象实例上设置属性来定义其依赖关系(即标准Setter方法)。然后,容器在创建bean时注入那些依赖项。从根本上讲,此过程是通过使用类的直接构造或服务定位器模式来控制bean自身依赖关系的实例化或位置的bean本身的逆过程(因此称为 Inversion of Control)。

  • 使用DI优点,代码更加简洁,当为对象提供依赖项时,解耦会更有效。该对象不查找其依赖项,也不知道依赖项的位置或类。结果就是您的类变得更易于测试,尤其是当依赖项依赖于接口或抽象基类时,它们允许在单元测试中使用存根或模拟实现。

  • DI的两种实现方式:

    • 基于构造函数的依赖注入 : 基于构造函数的DI是通过容器调用具有多个参数(每个参数代表一个依赖项)的构造函数来完成的。使用标签 ,有4种注入方式.
      DIDemo.java文件
package com.chen;
/**
 * @Description:
 * @author: chenDing
 * @date: 2020/2/26  12:45
 */
public class DIDemo {
    private String name;
    private int age;
    private String sex;

    public DIDemo(String name, int age, String sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("DIDemo{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append(", sex='").append(sex).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

  1. index + value 方式实现依赖注入:index索引从0开始,索引值必须和构造器中的参数索引位置相对应
    bean.xml文件


    
        
        
        

    

  1. name + value 方式实现依赖注入:name一定要和 java类的构造器形参名称一致,否则报错,
   
        
        
        

    
  1. type +value 方式实现依赖注入:type和java类的属性类型相对应
    
        
        
        

    
  1. value 方式实现依赖注入:必须和构造器中的参数相对性,其位置不可互换(会出现注入错误,或注入数据不正确)
    
        
        
        
    

以上配置都正确在测试类中DIDemoTest.java中会出现正确结果

package com.chen;

import org.junit.Test;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @Description:
 * @author: chenDing
 * @date: 2020/2/26  12:53
 */
public class DIDemoTest {
    @Test
    public void testDI() {
        ClassPathXmlApplicationContext ca = new ClassPathXmlApplicationContext("bean.xml");
        DIDemo diDemo = ca.getBean("diDemo", DIDemo.class);
        System.out.println(diDemo);
        ca.close(); //释放bean对象
    }
}

结果:

DIDemo{name='zhangsan', age=20, sex='男'}
Process finished with exit code 0
  • 基于Setter的依赖注入:基于标准Setter方法实现的依赖注入是通过在调用无参数构造函数或无参数static工厂方法以实例化您的bean 之后,在您的bean上调用setter方法来完成的。使用标签 若只使用该标签,则对应java类中必须要有无参构造方法,否则会报错
    DIDemo.java文件
package com.chen;
/**
 * @Description:
 * @author: chenDing
 * @date: 2020/2/26  12:45
 */
public class DIDemo {
    private String name;
    private int age;
    private String sex;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        final StringBuilder sb = new StringBuilder("DIDemo{");
        sb.append("name='").append(name).append('\'');
        sb.append(", age=").append(age);
        sb.append(", sex='").append(sex).append('\'');
        sb.append('}');
        return sb.toString();
    }
}

bean.xml

    
        
        
        

    

使用上述DIDemoTest.java得出正确结果:

DIDemo{name='zhangsan', age=20, sex='男'}
Process finished with exit code 0

小知识点:上述两种依赖注入方式可混用,但必须要有对应的构造器
如:bean.xml

    
        
         
        
        
    

你可能感兴趣的:(Spring基于xml依赖注入的两种方式(构造器和Setter))