DI Dependency Injection ,依赖注入
is a :是一个,继承。
has a:有一个,成员变量,依赖。
例子:
class Teacher {
private Phone phone; //Teacher 类依赖Phone 类
...
public Teacher(){
this.phone = new Phone();
}
}
这段代码可以发现这样几个问题:
(1)当我想要改变Phone的生成方式,例如用new Phone(String name);来初始化Phone,这时候我就要改变Teacher的代码块了。
(2)如果想测试不同 Phone对象时,对 Teacher的影响很大,因为 Phone的初始化被写死在了 Teacher的构造函数中;
依赖注入 上面将依赖在构造函数中直接初始化是一种 Hard init 方式,弊端在于两个类不够独立,不方便测试。我们还有另外一种 Init 方式,如下:
public class Teacher {
…
Phone phone;
…
public Teacher (Phone phone) {
this.phone= phone;
}
}
上面代码中,我们将 phone对象作为构造函数的一个参数传入。在调用 Teacher 的构造方法之前外部就已经初始化好了 phone对象。像这种非自己主动初始化依赖,而通过外部来传入依赖的方式,我们就称为依赖注入。
现在我们发现上面 1 中存在的两个问题都很好解决了,简单的说依赖注入主要有两个好处:
(1). 解耦,将依赖之间解耦。
(2). 因为已经解耦,所以方便做单元测试,尤其是 Mock 测试。
依赖:一个对象需要使用另一个对象
注入:通常有3种注入方式,上面的是构造函数注入还有接口注入、方法注入,例如通过setter方法进行另一个对象实例设置。
1、目标类
创建BookService的接口和实现类
创建BookDao的接口和实现类
编写xml文件
编写测试类
BookDao的接口和实现类
BookService的接口和实现类
xml文件
测试
结果