媒介
在Dagger2神器入门(二)中,我们通过简朴的demo劈头入门了Dagger2的简朴利用,我们相识了@Inject,@Module,@Provides和@Componet等注解的利用要领。在这一章节中我们主要办理上篇文章中留下的3个问题:
1 为什么要利用Dagger2来替代文章一开头的写法?
2 假如@Inject的结构器有多个怎么办?
3 如何存在依赖链怎么办?
1 为什么要利用Dagger2来替代文章一开头的写法?
我们先回回首一下文章开头的写法:
public class Car { private Engine engine; private Seat seat; private Wheel wheel; public Car() { engine = new Engine(); seat = new Seat(); wheel = new Wheel(); Log.d(Config.TAG, "new Car()"); } }
再看看利用Dagger2之后的代码:
public class Car { @Inject Engine engine; @Inject Seat seat; @Inject Wheel wheel; // private Engine engine; // private Seat seat; // private Wheel wheel; public Car() { // engine = new Engine(); // seat = new Seat(); // wheel = new Wheel(); DaggerCarComponent .builder() .carModule(new CarModule()) .build() .inject(this); Log.d(Config.TAG, "new Car()"); } }
那么问题来了?这样的写法长处在哪?
2 @Inject注解的Class有多个结构器怎么办?
神马意思呢?好比我们的车座大概会带一个座套,那么车座大概提供无车套车座和有车套车座。
public class Seat { //默认无车套车座 public Seat(){ Log.d(Config.TAG,"new Seat()"); } //提供有车套车座 public Seat(String str){ Log.d(Config.TAG,str); } }
那么接着第二章代码,会输出啥呢?
06-28 22:20:28.980 15053-15053/? D/TAG: new Engine() 06-28 22:20:28.981 15053-15053/? D/TAG: new Seat() 06-28 22:20:28.981 15053-15053/? D/TAG: new Wheel() 06-28 22:20:28.981 15053-15053/? D/TAG: new Car()
照旧一样的输出?why?我们要想到我们提供依赖者?
@Provides public Seat provideSeat(){ return new Seat(); }
因为这里提供的结构器就是无参的,我们换一个有参数的试试?
@Provides public Seat provideSeat(){ return new Seat("有车套"); }
输出
06-28 22:22:55.886 17342-17342/? D/TAG: new Engine() 06-28 22:22:55.886 17342-17342/? D/TAG: 有车套 06-28 22:22:55.886 17342-17342/? D/TAG: new Wheel() 06-28 22:22:55.886 17342-17342/? D/TAG: new Car()
那么有人会问,一个类可以或许提供2个provide呢?在Module中像这样写:
@Provides public Seat provideSeat(){ return new Seat(); } @Provides public Seat provideSeat2(){ return new Seat("有车套"); }
我们通过代码试试不就知道了?
Error:(13, 11) 错误: com.bae.basicandext.dagger.blog.bean.Seat is bound multiple times: @Provides com.bae.basicandext.dagger.blog.bean.Seat com.bae.basicandext.dagger.blog.dagger.CarModule.provideSeat() @Provides com.bae.basicandext.dagger.blog.bean.Seat com.bae.basicandext.dagger.blog.dagger.CarModule.provideSeats()
错误显示Seat类被绑定了多次。也就是说一个类只能提供一个结构器作为依赖。到这一步,我但愿可以或许找到相关说明文档来再次验证本身的想法,因为我担忧本身代码的错误导致本身错误的领略,官方文档给出的表明是100%正确的。
@Inject官方表明
@Inject can apply to at most one constructor per class。
这就验证了我的做法是正确的,同时也验证我的意料是正确的。
3 假如存在依赖链怎么办?
什么意思?这让我想起了设计模式中的责任链模式,在进修的进程中不绝的遐想,这是一种较量好的进修要领,因为我们要遵循艾宾浩斯遗忘曲线去进修,不单的固定才气不绝的提高本身。
那么我们这里的依赖链是怎么回事呢?其实很简朴,好比A依赖B,劳务派遣管理系统,B依赖C,C依赖D…
回归到我们的例子,我们的车座要依赖于皮革(leather),那么我们怎么办?
public class Leather { public Leather(){ Log.d(Config.TAG,"new Leather()"); } }