依赖注入
1. 什么是依赖
在classA中有classB的实例,则称classA对classB有一个依赖。
public class A{
B b;
public A(){
b = new B();
}
}
其中类A对类B有一个依赖。
对于上述例子,会有如下问题
- 如果要用b = new B(int n)来实例化b,则需要修改class A的代码
- 如果不同的B的对象对A的影响会很困难,因为B的对象已经写死在A中
- 如果new B() 过程很慢,单测时我们希望用已经初始化好的对象来mock掉这个过程也很困难
2. 依赖注入
上例中依赖在构造函数直接初始化是一种hard init的方式,弊端在于连个类不够独立,一下用另外一种方式来初始化
public class A{
B b;
public A(B b){
this.b = b;
}
}
上述代码中将对象作为构造函数的参数传入,在掉用构造函数之前外部就已经初始化好了B的对象。像这种非自己主动初始化依赖,而通过外部传入依赖的方式,称为依赖注入
由此有连个好处
- 解耦
- 方便单元测试,尤其mock测试
3. 在JAVA中实现依赖注入
在java中实现依赖注入有多种方式,其中最常见的就是通过注解的方式。
通过在字段的声明前添加@Inject注解进行标记,来实现依赖对象的自动注入。
public class Human{
@Inject Father father;
public Human(){
}
}
事实上这样还不能自动完成依赖注入,还需要一个依赖注入框架,并进行简单的配置。Java语言流行的依赖注入框架有google guice,spring等。在Android上比较流行的有RoboGuice,Dragger等。