最简单易懂的dagger2示例

来源:互联网 发布:我的世界0.14作弊js 编辑:程序博客网 时间:2024/05/22 17:05
在网上搜了很多资料,包括官网,都看不懂,基本打算放弃了。何况从功能上看,用inject替代new,似乎提升不大。

最后时刻这篇博文拯救了我:https://zhuanlan.zhihu.com/p/24454466 。此文完全抛开了其他博文涉及的Android+MVP等复杂构架,是最简的纯java案例,我一下子就看懂了,可能就10分钟吧,我就实现了0->1的转化。其他博文也写得很用心,但写得都是1->9,故我怎么也看不懂。

拯救我的这篇文章共有4个案例,其中最重要的是第三个,看懂即够。有个微小的遗憾是,作者没有提供可执行的代码,于是我整理成了最简Android版,其中的第三个放在github上:https://github.com/maxyou/Dagger2Demo3。第一个和第二个案例的代码也打包放在里面。这里展示一下第三个的可运行代码,请反复查看相关类、变量的相互关联,于是你就知道是怎么回事了:
    public class Car {            @MarkCarModule.QualifierA        @Inject Engine engineA;        @MarkCarModule.QualifierB        @Inject Engine engineB;                public Car() {            DaggerCarComponent.builder().markCarModule(new MarkCarModule())                  .build().inject(this);        }        public Engine getEngineA() {            return this.engineA;        }        public Engine getEngineB() {            return this.engineB;        }    }        @Component(modules = {MarkCarModule.class})    public interface CarComponent {        void inject(Car car);    }    public class Engine {        String engine_run;        public Engine(){}        public Engine(String s){engine_run = s;}        public String run(){return engine_run;}    }    @Module    public class MarkCarModule {            @Qualifier        @Retention(RetentionPolicy.RUNTIME)        public static @interface QualifierA { }        @Qualifier        @Retention(RetentionPolicy.RUNTIME)        public static @interface QualifierB { }            public MarkCarModule(){ }        @QualifierA        @Provides        Engine provideEngineA(){            return new Engine("gearA");        }        @QualifierB        @Provides        Engine provideEngineB(){            return new Engine("gearB");        }    }

看各处关联的一个方法是,尝试修改其中的方法名等,看看IDE会给你怎样的提示,你就明白其中的关联了。

值得提示的是其中的一个类DaggerCarComponent并非用户定义,而是dagger2模块帮忙生成的中间数据,大概要rebuild之后才不报错

其中的@Qualifier可以使用更简单@Named替代,具体用法直接看如下示例即可:
@Provides @Named("cached")@SingletonOkHttpClient provideOkHttpClient(Cache cache) {    OkHttpClient client = new OkHttpClient();    client.setCache(cache);    return client;}@Provides @Named("non_cached")@SingletonOkHttpClient provideOkHttpClient() {    OkHttpClient client = new OkHttpClient();    return client;}@Inject @Named("cached") OkHttpClient client;@Inject @Named("non_cached") OkHttpClient client2;

以上,基本应用已经足够。如果要继续深研,可以学习@Scope和@Singleton这样的注解

感谢:
1. https://zhuanlan.zhihu.com/p/24454466  神兵利器Dagger2
纯java,帮忙通过最为关键的0->1
2. http://www.jianshu.com/p/39d1df6c877d  Dagger2从入门到放弃再到恍然大悟
此文不厌其烦地讲解了dagger2在Android的MVP模式下的应用,还详细分析了注入过程

此外还阅读了好几篇其他博文,这种从多处学习,再自己整理并分享的感觉真好。