android开源库---Dagger2入门学习(为什么使用)

看了前面的文章大概都了解了Dagger2。
那么问题来了,为什么我们要是使用Dagger2呢?具体有什么优势呢?
看看原来的代码

public class Boy {

    String name;

    public Boy(String name ){
        // 修改了构造方法
        this.name = name;
    }

    public void run(){

    }
}
public class Girl{

    // 依赖类
    private Boy boy;


    public Girl(){
        //  因为Boy的构造方法发生变化,所以需要修改该处代码
        boy = new Boy("小明");
    }



    public void run(){
        boy.run();
    }

}

这里发现我们该了一个构造方法就要去gril那改代码,如果是工程中,大量的代码这么改是不实际的!
那么Dagger2呢?

@Module
public class GirlModule {
    @Provides
    public Boy provideBoy(){
        return new Boy();
    }
}

我们要是给boy换了如上的构造器,我们只需该modle

@Module
public class GirlModule {
    @Provides
    public Boy provideBoy(){
        return new Boy(“小明”);
    }
}

那么有人 就说了,这不差不多么!都是改一个地方。
对这一点代码是差不多,但是如果代码量庞大的时候你很难找到或找全对应改动的地方,而用Dagger2有modle的管理我们改动起来就会轻松许多。

@Inject注解的Class有多个构造器怎么办?

如下:

public class Boy {
    private Work work;
    public Boy(Work work){
        this.work = work;
        Log.d(Config.TAG,"new Boy(work)");
    }
    public Boy(){}
}

这是个男孩有了工作这个构造方法。
单一使用都没问题,去modl中改下参数就好。
那么有人就会想到写两个2个provide。那能行么?我们试下

@Provides
    public Boy provideBoy(Work work){
        return new Boy(work);
    }
    @Provides
    public Boy provideBoy2(Work work){
        return new Boy();
    }

会报错

Error:(11, 10) 错误: com.example.admin.dagger2.gg.Boy is bound multiple times:
@Provides com.example.admin.dagger2.gg.Boy com.example.admin.dagger2.gg.GirlModule.provideBoy(com.example.admin.dagger2.gg.Work)
@Provides com.example.admin.dagger2.gg.Boy com.example.admin.dagger2.gg.GirlModule.provideBoy2(com.example.admin.dagger2.gg.Work)

错误显示Boy类被绑定了多次。也就是说一个类只能提供一个构造器作为依赖
官方文档也明确的指出了

@Inject can apply to at most one constructor per class.

如果依赖存在依赖怎么办

简单就是说就是上面的女孩是依赖男孩的(前面两篇有说到)Dagger2注入
同时呢就如上面所说,男孩依赖于工作。

public class Boy {
    private Work work;
    public Boy(Work work){
        this.work = work;
        Log.d(Config.TAG,"new Boy(work)");
    }
    public Boy(){}
}

首先我们要modle中provideBoy改变

@Provides
    public Boy provideBoy(Work work){
        return new Boy(work);
    }

但是这样还是不够的,我们找不到Work
所以还要在modle加入


    @Provides
    public Work provideWork(){
        return new Work();
    }

完整代码(provideParents是上篇文章中的不必看它)

@Module
public class GirlModule {
    @Provides
    public Boy provideBoy(Work work){
        return new Boy(work);
    }
    @Provides
    public Parents provideParents(){
        return new Parents();
    }

    @Provides
    public Work provideWork(){
        return new Work();
    }
}

这样就行了不?我们试试

07-26 23:15:38.205 23475-23475/com.example.admin.dagger2 D/test: new Work(work)
07-26 23:15:38.206 23475-23475/com.example.admin.dagger2 D/test: new Boy(work)
07-26 23:15:38.207 23475-23475/com.example.admin.dagger2 D/test: new Parents(parents)
07-26 23:15:38.207 23475-23475/com.example.admin.dagger2 D/test: new Girl()

很明显,它能够自动找到Work依赖。所以最关键的关键还是在Module类中。
好了,这里我们就先结束,我们下面要继续研究下其他的用法!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值