Dagger前传

本篇不适合学习使用Dagger的新手看,比较适合给老鸟增加对Dagger的理解使用。

其实对Dagger的使用。需要自己手写module类和component类。
但是你可能不知道module类在某些情况下可以不写,依然可以完成依赖注入的效果。

比如ClassA要注入到MainActivity。因为ClassA是自定义类型,我们可以直接在其构造函数上添加@inject

public class ClassA {

@Inject
    public  ClassA() {
 
    }
}

对应,使用时

 @Inject
     ClassA aa;

当然还需要书写component这个像桥一样的类来连接两处。

@Component(因为使用了inject注解了ClassA的出处,所以不需要在通过module类来提供了)
public interface aaComponent {
    void inject(MainActivity activity);
}

最后
在mainactivity中

DaggeraaComponent.create().inject(this);

增加一层注入

如果ClassA的构造函数需要传入ClassB作为参数的话,在ClassB的构造函数也加上,此时有三处inject注解

public class ClassB {

    @Inject
    public ClassB () {
    }
}

其他完全不变。

从这里我们可以发现:Dagger具备递归创建对象的能力。在mainactivity中需要ClassA的时候,会去检查其inject的构造函数,然后如果需要的话,再检查下去。然后Dagger帮你创建ClassB,再创建A,最后注入。
如果检查下去,比如B的构造函数检查不到inject注解,这时就需要module类来提供。

通过这篇文章我们发现,module类的作用:

如果需要注入的类是我们自定义类(可以修改代码),可以添加inject的,那么完全不需要module。(但是你偏偏可以注解却不注解,想通过module来提供,我也是拦不住的)

而module的出现就是为了解决,
我们无法给一些第三方api,或许jar包里的代码(比如activity,或者Stringt这种)添加inject注解,不能去修改其构造行数。所以这个时候需要手写module,通过module来生成

你可能感兴趣的:(Dagger前传)