在网上搜了很多资料,包括官网,都看不懂,基本打算放弃了。何况从功能上看,用inject替代new,似乎提升不大。
最后时刻这篇博文拯救了我: https://zhuanlan.zhihu.com/p/24454466 。此文完全抛开了其他博文涉及的Android+MVP等复杂构架,是最简的纯java案例,我一下子就看懂了,可能就10分钟吧,我就实现了0->1的转化。其他博文也写得很用心,但写得都是1->9,故我怎么也看不懂。
拯救我的这篇文章共有4个案例,其中最重要的是第三个,看懂即够。有个微小的遗憾是,作者没有提供可执行的代码,于是我整理成了最简Android版,其中的第三个放在github上: https://github.com/maxyou/Dagger2Demo3。第一个和第二个案例的代码也打包放在里面。这里展示一下第三个的可运行代码,请反复查看相关类、变量的相互关联,于是你就知道是怎么回事了:
看各处关联的一个方法是,尝试修改其中的方法名等,看看IDE会给你怎样的提示,你就明白其中的关联了。
值得提示的是其中的一个类DaggerCarComponent并非用户定义,而是dagger2模块帮忙生成的中间数据,大概要rebuild之后才不报错
其中的@Qualifier可以使用更简单@Named替代,具体用法直接看如下示例即可:
以上,基本应用已经足够。如果要继续深研,可以学习@Scope和@Singleton这样的注解
感谢:
1. https://zhuanlan.zhihu.com/p/24454466 神兵利器Dagger2
纯java,帮忙通过最为关键的0->1
2. http://www.jianshu.com/p/39d1df6c877d Dagger2从入门到放弃再到恍然大悟
此文不厌其烦地讲解了dagger2在Android的MVP模式下的应用,还详细分析了注入过程
此外还阅读了好几篇其他博文,这种从多处学习,再自己整理并分享的感觉真好。
最后时刻这篇博文拯救了我: 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")
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
OkHttpClient client = new OkHttpClient();
client.setCache(cache);
return client;
}
@Provides @Named("non_cached")
@Singleton
OkHttpClient 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模式下的应用,还详细分析了注入过程
此外还阅读了好几篇其他博文,这种从多处学习,再自己整理并分享的感觉真好。