依赖注入与Dagger2使用入门

前端之家收集整理的这篇文章主要介绍了依赖注入与Dagger2使用入门前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

依赖注入

在开始之前,我们先要搞懂什么是依赖注入。

第一个版本。

/** * 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在背后默默实现的。

猜你在找的设计模式相关文章