欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 宝鼎售后问题提交 | 后台管理


新闻资讯

MENU

软件开发知识

Dagger2 神器 劳务派遣管理系统 入门(二)

点击: 次  来源:宝鼎软件 时间:2017-09-06

原文出处: 小腊月

媒介

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 暗示该要领提供依赖;通过这个注解的要领,能给你提供依赖,看代码应该清楚。