看了前面的文章大概都了解了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类中。
好了,这里我们就先结束,我们下面要继续研究下其他的用法!