dagger2简介,以及它与clean architecture的关系
首先要明确dagger2是依赖注入框架,用来注入依赖的,它是一个工具。在app里用了dagger不代表你用了clean architecture架构。dagger2只是一个可替换的工具。clean architecture架构只是说应该使用依赖注入,并没有说应该用dagger2。
点击打开链接 这里有个很好的介绍,指出了依赖注入的以下好处
1 易于测试:通过注入mock的依赖来做单元测试。
2 易于并行开发:不同的人可以同时开发不同功能,最后通过依赖注入来组装。
如果仅仅通过setters或者构造函数来注入依赖,就会需要很多模板代码。这一点很好理解:设计程序架构的时候,一方面我们会让一个类有单一的职责,另一方面需要让程序实现很多功能,结果就是实现功能的时候会依赖很多类。这个介绍里面给了一个比较极端的例子:如果有个比较大的项目,你可能会遇上一个3000行的构造函数。这个时候就需要依赖注入框架:GUICE, SPRING, DAGGER1, DAGGER2.那么多框架为什么用dagger2? 因为Jake Wharton大神推荐dagger2。 点击打开链接 具体理由在这里面有,我也没用过GUICE,SPRING,所以实在体会不深,就不写了。
然后简单介绍一下dagger的使用。可以想象,任何依赖注入框架无非就是要指明依赖的来源以及在哪里用到依赖。dagger应该也差不多是这样。
1 使用 field injection
1.1 采用@Module 和 @Provides 注释来指明依赖的来源。
比如,如果你需要一个XX类的对象作为依赖。
@Module
public class XXModule {
@Provides
@Singleton
public XX getXX(){...}
}
@Singleton指明这个依赖是个单例,getXX方法里new出对象(或者用工厂方法之类的),这个方法的名字可以随便起,dagger2回调用这个方法,使用者不用调用。
* 注意,可能会遇到需要同一个类的不同对象作为依赖的情况,比如分别需要ClassA objA1和ClassA objA2,怎么办。可以用 @Named这个注释加以区分。
比如,可以用下面的方法区分两个依赖。在后面使用依赖的时候同样用@Named来选取需要的依赖。
@Provides @Singleton @Named("object1") public XX getXX1(){...}
@Provides @Singleton @Named("object2") public XX getXX2(){...}
1.2 采用@Component注释来指明需要注入依赖的类
@Component (specify all the Modules here)
interface XXcomponent {
void inject(target activty or frag orwhat ever)
}
@Component 后面指明注入依赖的来源也就是1.1中定义的modules (modules={DataModule.class})
XXcomponent是一个接口,接口中一个void inject(YY yy)表示一个YY的类可能会需要XX的依赖。安卓中很多情况就是void inject(Activity activity)
1.3 获得XXcomponent的对象。
XXcomponent component= DaggerXXcomponent.builder().build();
DaggerXXcomponent这个类是dagger2框架自动生成的,build一下项目后才会有。注意这个类名字是Dagger加上1.2中接口的名字。
1.4 在你需要依赖的地方(既然是field injection,那就是在类中的域上)来请求依赖
@Inject XX xx;
1.5 最后一步:调用 component.inject(yy)的方法。比如说,需要在MainActivity里面注入依赖,那就是component.inject(mainActivity);
2 constructor injection 和field injection差不多,首先在依赖的构造上加上@Inject注释
2.1 同1.1
2.2 和1.2一样建立XXcomponent接口,只是接口中需要加上 XX provideXX()方法
2.3 同1.3
2.4 获取依赖的方法和field injection 有点不同。直接调用 XXcomponent的provideXX()方法。
最后简单说下butter knife,Jake Wharton给它的介绍是: it is just like dagger but infinitely less sharp. dagger可以注入任何的类,butterknife是专门注入安卓的view。它基本上可以理解为替代findViewById的,相比于dagger,它的使用就简单很多,网上介绍也很多,就不细讲了。