依赖注入
在开始之前,我们先要搞懂什么是依赖注入。
第一个版本。
/** * Created by REXZOU on 2015/11/21. */
public class Motor {
public void addGas() {
}
}
/** * Created by REXZOU on 2015/11/21. */
public class Car {
private final Motor mMotor;
public Car() {
mMotor = new Motor();
}
}
我们用下图表示两者关系
我们要制造一台汽车,每台汽车里面包含了一个发动机。但我们发现汽车和引擎的结合太紧密了,比如想汽车从汽油机改为柴油机,那就重新造一台汽车,太费事了。于是,我们把汽车类稍为改一下。
/** * Created by REXZOU on 2015/11/21. */
public class Car {
private final Motor mMotor;
public Car(Motor motor) {
mMotor = motor;
}
}
现在不一样,我们的发动机不是和汽车一起制造的,而变成组装了。是在外面造好之后,再安装进来,他们逻辑关系图就成了以下这样:
这样,当我们改变发动机的参数或是类型时,我们都不需要去修改汽车Car这个类。
这个问题解决了,新的问题又来了,谁来负责创建Motor。
这个时候,需要Dagger出场了。
Dagger的配置
为了使用Dagger需要在dependency中加入
provided 'org.glassfish:javax.annotation:10.0-b28'
apt 'com.google.dagger:dagger-compiler:2.0.2'
compile 'com.google.dagger:dagger:2.0.2'
对于car这个类,我们修改为:
/** * Created by REXZOU on 2015/11/21. */
public class Car {
private Motor mMotor;
@Inject
public Car(Motor motor) {
mMotor = motor;
}
}
@Inject,表示这里需要从外面赋值。
/** * Created by REXZOU on 2015/11/27. */
@Singleton
@Component(modules = {CarFactory.class})
public interface CarComponent {
Car provideCar();
}
/**
* Created by REXZOU on 2015/11/21.
*/
@Module
public class CarFactory {
@Provides @Singleton
Car makeCar() {
return new Car(new Motor());
}
@Provides @Singleton
Motor makeMotor() {
return new Motor();
}
}
/** * Created by REXZOU on 2015/11/21. */
public class Motor {
public void addGas() {
}
}
最终使用方式:
CarComponent component = DaggerCarComponent.builder().carFactory(new CarFactory()).build();
Car car = component.provideCar();
也就是我们看到,我们没有创建car本身,一切都是Dagger在背后默默实现的。