美文网首页
Dagger前传

Dagger前传

作者: _Youngjim | 来源:发表于2018-04-26 15:49 被阅读0次

    本篇不适合学习使用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前传

          本文链接:https://www.haomeiwen.com/subject/wrtmlftx.html