dagger2简介,以及它与clean architecture的关系

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,它的使用就简单很多,网上介绍也很多,就不细讲了。









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值