媒介
在Dagger2神器入门(一)中,我们相识了什么是依赖注入,那么在这一章中,我们将逐渐入门Dagger2。接下来我们会通过demo形式给各人揭示Dagger2的神奇之处。
上文中通过”开车上班”的例相识了什么是”依赖注入”,那么我们继承这例子。我们知道车由动员机,轮子,车座等部件构成。那么,假如我们要造一辆车的话,大概需要这些部件。回归到代码中,我们new一个Car大概需要动员机,轮子,车座等工具。
原始依赖
首先,我们建设造车所需要的部件。
动员机
/** * 动员机 */ public class Engine { public Engine(){ Log.d(Config.TAG,"new Engine()"); } }
车座
/** * 车座 */ public class Seat { public Seat(){ Log.d(Config.TAG,"new Seat()"); } }
轮子
/** * 轮子 */ public class Wheel { public Wheel(){ Log.d(Config.TAG,"new Wheel()"); } }
上面3个类用到了Config设置类,其实就是一个字符串。
public class Config { public static final String TAG = "TAG"; }
另话:把民众的部门抽取出来,也是代码类型的一部门。在此后的事情中,需要不绝review自身代码,跟着技能程度的提高,代码质量也需要不绝提高。
上面的代码中,我们写了3个类,都是用来造车的构件。那么对付造车,对应于我们的代码就是new Car(),就是这么简朴。可是Car大概需要Engine,Seat,Wheel 等组件。那么我们来造个车试试。
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()"); } }
凭据正常逻辑,劳务派遣管理系统,Car类应该是这样写。那么我们在new Car()试试。
06-27 12:44:53.726 18967-18967/com.bae.basicandext D/TAG: new Engine() 06-27 12:44:53.726 18967-18967/com.bae.basicandext D/TAG: new Seat() 06-27 12:44:53.726 18967-18967/com.bae.basicandext D/TAG: new Wheel() 06-27 12:44:53.726 18967-18967/com.bae.basicandext D/TAG: new Car()
就这样,我们把Car给new出来了,这样写也是没有问题的。
那么接下来我们用Dagger2的方法,来做做试试,先不管他们之间的区别,just do it。做出来结果之后再回过甚来反思。
Dagger2依赖注入
下面让我们一步一步走下去:
1 在modle的build.gradle文件中添加
annotationProcessor 'com.google.dagger:dagger-compiler:2.0.2' compile 'com.google.dagger:dagger:2.0.2' provided 'org.glassfish:javax.annotation:10.0-b28'
2 写一个Module类,打点上面的三个依赖。
@Module public class CarModule { @Provides public Engine provideEngine(){ return new Engine(); } @Provides public Seat provideSeat(){ return new Seat(); } @Provides public Wheel provideWheel(){ return new Wheel(); } }
3 写一个Component类,来毗连Module和你的Car。
@Component(modules = CarModule.class) public interface CarComponent { void inject(Car car); }
4 重写Car类
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()"); } }
看看输出
06-27 13:03:25.447 26227-26227/com.bae.basicandext D/TAG: new Engine() 06-27 13:03:25.447 26227-26227/com.bae.basicandext D/TAG: new Seat() 06-27 13:03:25.447 26227-26227/com.bae.basicandext D/TAG: new Wheel() 06-27 13:03:25.447 26227-26227/com.bae.basicandext D/TAG: new Car()
是不是到达了和之前一样的结果呢?是不是从第3步开始,就不知道为什么这样写了呢?
阐明
我们看看CarModule类是用一个@Module注解的类,内里的要领是利用@Provides注解。什么意思呢?
@Moudle 暗示该类可以或许打点并提供依赖;你需要造车,可是车依赖于动员机,轮胎以及车座,那么写一个@Module注解的类来帮你打点这些依赖。
@Provides 暗示该要领提供依赖;通过这个注解的要领,能给你提供依赖,看代码应该清楚。